qtbindings 4.8.6.3 → 4.8.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/COPYING.LIB.txt +510 -510
- data/COPYING.txt +286 -286
- data/KNOWN_ISSUES.txt +17 -17
- data/bin/rbqtapi +0 -0
- data/bin/rbrcc +0 -0
- data/bin/rbuic4 +0 -0
- data/bin/smokeapi +0 -0
- data/bin/smokedeptool +0 -0
- data/examples/designer/calculatorbuilder/calculatorbuilder.qrc +5 -5
- data/examples/designer/calculatorbuilder/calculatorform.rb +60 -60
- data/examples/designer/calculatorbuilder/calculatorform.ui +299 -299
- data/examples/designer/calculatorbuilder/main.rb +34 -34
- data/examples/designer/calculatorbuilder/makefile +2 -2
- data/examples/designer/calculatorform/calculatorform.rb +46 -46
- data/examples/designer/calculatorform/calculatorform.ui +277 -277
- data/examples/designer/calculatorform/main.rb +32 -32
- data/examples/designer/calculatorform/makefile +3 -3
- data/examples/desktop/screenshot/main.rb +32 -32
- data/examples/desktop/screenshot/screenshot.rb +157 -157
- data/examples/desktop/systray/images/bad.svg +64 -64
- data/examples/desktop/systray/images/heart.svg +55 -55
- data/examples/desktop/systray/images/trash.svg +58 -58
- data/examples/desktop/systray/main.rb +41 -41
- data/examples/desktop/systray/makefile +2 -2
- data/examples/desktop/systray/systray.qrc +7 -7
- data/examples/desktop/systray/window.rb +219 -219
- data/examples/dialogs/complexwizard/complexwizard.rb +140 -140
- data/examples/dialogs/complexwizard/licensewizard.rb +294 -294
- data/examples/dialogs/complexwizard/main.rb +31 -31
- data/examples/dialogs/configdialog/configdialog.rb +109 -109
- data/examples/dialogs/configdialog/main.rb +31 -31
- data/examples/dialogs/configdialog/pages.rb +140 -140
- data/examples/dialogs/extension/finddialog.rb +89 -89
- data/examples/dialogs/extension/main.rb +31 -31
- data/examples/dialogs/findfiles/main.rb +32 -32
- data/examples/dialogs/findfiles/window.rb +177 -177
- data/examples/dialogs/simplewizard/classwizard.rb +374 -374
- data/examples/dialogs/simplewizard/main.rb +31 -31
- data/examples/dialogs/simplewizard/simplewizard.rb +110 -110
- data/examples/dialogs/standarddialogs/dialog.rb +340 -340
- data/examples/dialogs/standarddialogs/main.rb +31 -31
- data/examples/dialogs/tabdialog/main.rb +38 -38
- data/examples/dialogs/tabdialog/tabdialog.rb +178 -178
- data/examples/draganddrop/draggableicons/dragwidget.rb +125 -125
- data/examples/draganddrop/draggableicons/main.rb +41 -41
- data/examples/draganddrop/draggabletext/draglabel.rb +51 -51
- data/examples/draganddrop/draggabletext/dragwidget.rb +94 -94
- data/examples/draganddrop/draggabletext/main.rb +33 -33
- data/examples/draganddrop/draggabletext/words.txt +41 -41
- data/examples/draganddrop/dropsite/dropsitewidget.rb +99 -99
- data/examples/draganddrop/dropsite/dropsitewindow.rb +114 -114
- data/examples/draganddrop/dropsite/main.rb +33 -33
- data/examples/draganddrop/fridgemagnets/draglabel.rb +78 -78
- data/examples/draganddrop/fridgemagnets/dragwidget.rb +130 -130
- data/examples/draganddrop/fridgemagnets/main.rb +33 -33
- data/examples/draganddrop/fridgemagnets/words.txt +48 -48
- data/examples/draganddrop/puzzle/main.rb +33 -33
- data/examples/draganddrop/puzzle/mainwindow.rb +136 -136
- data/examples/draganddrop/puzzle/pieceslist.rb +95 -95
- data/examples/draganddrop/puzzle/puzzlewidget.rb +190 -190
- data/examples/graphicsview/collidingmice/main.rb +53 -53
- data/examples/graphicsview/collidingmice/makefile +2 -2
- data/examples/graphicsview/collidingmice/mice.qrc +5 -5
- data/examples/graphicsview/collidingmice/mouse.rb +176 -176
- data/examples/graphicsview/dragdroprobot/coloritem.rb +86 -86
- data/examples/graphicsview/dragdroprobot/main.rb +57 -57
- data/examples/graphicsview/dragdroprobot/makefile +2 -2
- data/examples/graphicsview/dragdroprobot/robot.qrc +5 -5
- data/examples/graphicsview/dragdroprobot/robot.rb +246 -246
- data/examples/itemviews/chart/chart.qrc +5 -5
- data/examples/itemviews/chart/main.rb +33 -33
- data/examples/itemviews/chart/mainwindow.rb +151 -151
- data/examples/itemviews/chart/makefile +2 -2
- data/examples/itemviews/chart/mydata.cht +8 -8
- data/examples/itemviews/chart/pieview.rb +516 -516
- data/examples/itemviews/chart/qtdata.cht +14 -14
- data/examples/itemviews/dirview/main.rb +39 -39
- data/examples/itemviews/pixelator/imagemodel.rb +51 -51
- data/examples/itemviews/pixelator/images.qrc +5 -5
- data/examples/itemviews/pixelator/main.rb +34 -34
- data/examples/itemviews/pixelator/mainwindow.rb +218 -218
- data/examples/itemviews/pixelator/makefile +3 -3
- data/examples/itemviews/pixelator/pixeldelegate.rb +67 -67
- data/examples/itemviews/puzzle/main.rb +36 -36
- data/examples/itemviews/puzzle/mainwindow.rb +143 -143
- data/examples/itemviews/puzzle/piecesmodel.rb +174 -174
- data/examples/itemviews/puzzle/puzzlewidget.rb +192 -192
- data/examples/itemviews/simpledommodel/domitem.rb +62 -62
- data/examples/itemviews/simpledommodel/dommodel.rb +139 -139
- data/examples/itemviews/simpledommodel/main.rb +33 -33
- data/examples/itemviews/simpledommodel/mainwindow.rb +66 -66
- data/examples/itemviews/simpletreemodel/default.txt +40 -40
- data/examples/itemviews/simpletreemodel/main.rb +41 -41
- data/examples/itemviews/simpletreemodel/makefile +2 -2
- data/examples/itemviews/simpletreemodel/simpletreemodel.qrc +5 -5
- data/examples/itemviews/simpletreemodel/treeitem.rb +67 -67
- data/examples/itemviews/simpletreemodel/treemodel.rb +164 -164
- data/examples/itemviews/sortingmodel/default.txt +40 -40
- data/examples/itemviews/sortingmodel/main.rb +53 -53
- data/examples/itemviews/sortingmodel/treeitem.rb +73 -73
- data/examples/itemviews/sortingmodel/treemodel.rb +166 -166
- data/examples/itemviews/spinboxdelegate/main.rb +47 -47
- data/examples/itemviews/spinboxdelegate/spinboxdelegate.rb +62 -62
- data/examples/killerfilter/killerfilter.rb +55 -55
- data/examples/layouts/basiclayouts/dialog.rb +110 -110
- data/examples/layouts/basiclayouts/main.rb +31 -31
- data/examples/layouts/borderlayout/borderlayout.rb +190 -190
- data/examples/layouts/borderlayout/main.rb +32 -32
- data/examples/layouts/borderlayout/window.rb +52 -52
- data/examples/layouts/flowlayouts/flowlayout.rb +108 -108
- data/examples/layouts/flowlayouts/main.rb +32 -32
- data/examples/layouts/flowlayouts/window.rb +43 -43
- data/examples/mainwindows/application/main.rb +32 -32
- data/examples/mainwindows/application/mainwindow.rb +285 -285
- data/examples/mainwindows/dockwidgets/main.rb +32 -32
- data/examples/mainwindows/dockwidgets/mainwindow.rb +302 -302
- data/examples/mainwindows/mdi/main.rb +32 -32
- data/examples/mainwindows/mdi/mainwindow.rb +363 -363
- data/examples/mainwindows/mdi/mdichild.rb +152 -152
- data/examples/mainwindows/menus/main.rb +32 -32
- data/examples/mainwindows/menus/mainwindow.rb +327 -327
- data/examples/mainwindows/recentfiles/main.rb +32 -32
- data/examples/mainwindows/recentfiles/mainwindow.rb +258 -258
- data/examples/mainwindows/sdi/main.rb +32 -32
- data/examples/mainwindows/sdi/mainwindow.rb +335 -335
- data/examples/network/broadcastreceiver/main.rb +32 -32
- data/examples/network/broadcastreceiver/receiver.rb +64 -64
- data/examples/network/broadcastsender/main.rb +32 -32
- data/examples/network/broadcastsender/sender.rb +72 -72
- data/examples/network/fortuneclient/client.rb +149 -149
- data/examples/network/fortuneclient/main.rb +32 -32
- data/examples/network/fortuneserver/main.rb +32 -32
- data/examples/network/fortuneserver/server.rb +88 -88
- data/examples/network/ftp/ftpwindow.rb +259 -259
- data/examples/network/ftp/main.rb +32 -32
- data/examples/network/http/httpwindow.rb +187 -187
- data/examples/network/http/main.rb +32 -32
- data/examples/network/loopback/dialog.rb +163 -163
- data/examples/network/loopback/main.rb +32 -32
- data/examples/opengl/grabber/glwidget.rb +265 -265
- data/examples/opengl/grabber/main.rb +32 -32
- data/examples/opengl/grabber/mainwindow.rb +189 -189
- data/examples/opengl/hellogl/glwidget.rb +226 -226
- data/examples/opengl/hellogl/main.rb +32 -32
- data/examples/opengl/hellogl/window.rb +66 -66
- data/examples/opengl/textures/glwidget.rb +151 -151
- data/examples/opengl/textures/main.rb +32 -32
- data/examples/opengl/textures/window.rb +77 -77
- data/examples/painting/basicdrawing/main.rb +32 -32
- data/examples/painting/basicdrawing/renderarea.rb +166 -166
- data/examples/painting/basicdrawing/window.rb +215 -215
- data/examples/painting/concentriccircles/circlewidget.rb +88 -88
- data/examples/painting/concentriccircles/main.rb +32 -32
- data/examples/painting/concentriccircles/window.rb +72 -72
- data/examples/painting/fontsampler/main.rb +32 -32
- data/examples/painting/fontsampler/mainwindow.rb +369 -369
- data/examples/painting/fontsampler/mainwindowbase.ui +136 -136
- data/examples/painting/fontsampler/makefile +8 -8
- data/examples/painting/fontsampler/previewdialog.rb +257 -257
- data/examples/painting/fontsampler/previewdialogbase.ui +224 -224
- data/examples/painting/fontsampler/previewlabel.rb +43 -43
- data/examples/painting/imagecomposition/imagecomposer.rb +152 -152
- data/examples/painting/imagecomposition/imagecomposition.qrc +6 -6
- data/examples/painting/imagecomposition/main.rb +33 -33
- data/examples/painting/imagecomposition/makefile +2 -2
- data/examples/painting/painterpaths/main.rb +32 -32
- data/examples/painting/painterpaths/renderarea.rb +97 -97
- data/examples/painting/painterpaths/window.rb +247 -247
- data/examples/painting/svgviewer/files/bubbles.svg +212 -212
- data/examples/painting/svgviewer/files/cubic.svg +77 -77
- data/examples/painting/svgviewer/files/spheres.svg +79 -79
- data/examples/painting/svgviewer/main.rb +38 -38
- data/examples/painting/svgviewer/mainwindow.rb +99 -99
- data/examples/painting/svgviewer/makefile +2 -2
- data/examples/painting/svgviewer/svgview.rb +156 -156
- data/examples/painting/svgviewer/svgviewer.qrc +6 -6
- data/examples/painting/svgviewer/svgwindow.rb +87 -87
- data/examples/painting/transformations/main.rb +32 -32
- data/examples/painting/transformations/renderarea.rb +127 -127
- data/examples/painting/transformations/window.rb +153 -153
- data/examples/passivepopup/passivepopup.rb +38 -38
- data/examples/qdbus/chat/chat.rb +146 -146
- data/examples/qdbus/chat/chat_adaptor.rb +12 -12
- data/examples/qdbus/chat/chat_interface.rb +13 -13
- data/examples/qdbus/chat/chatmainwindow.ui +184 -184
- data/examples/qdbus/chat/chatsetnickname.ui +145 -145
- data/examples/qdbus/chat/makefile +8 -8
- data/examples/qdbus/complexpingpong/complexping.rb +92 -92
- data/examples/qdbus/complexpingpong/complexpong.rb +83 -83
- data/examples/qdbus/complexpingpong/ping-common.rb +1 -1
- data/examples/qdbus/listnames/listnames.rb +69 -69
- data/examples/qdbus/pingpong/ping-common.rb +1 -1
- data/examples/qdbus/pingpong/ping.rb +52 -52
- data/examples/qdbus/pingpong/pong.rb +55 -55
- data/examples/qdbus/remotecontrolledcar/car/car.rb +151 -151
- data/examples/qdbus/remotecontrolledcar/car/main.rb +50 -50
- data/examples/qdbus/remotecontrolledcar/controller/controller.rb +66 -66
- data/examples/qdbus/remotecontrolledcar/controller/controller.ui +61 -61
- data/examples/qdbus/remotecontrolledcar/controller/main.rb +32 -32
- data/examples/qdbus/remotecontrolledcar/controller/makefile +2 -2
- data/examples/qtscribble/scribble.rb +270 -270
- data/examples/richtext/calendar/main.rb +33 -33
- data/examples/richtext/calendar/mainwindow.rb +173 -173
- data/examples/richtext/orderform/detailsdialog.rb +130 -130
- data/examples/richtext/orderform/main.rb +34 -34
- data/examples/richtext/orderform/mainwindow.rb +194 -194
- data/examples/richtext/syntaxhighlighter/examples/example +79 -79
- data/examples/richtext/syntaxhighlighter/highlighter.rb +90 -90
- data/examples/richtext/syntaxhighlighter/main.rb +34 -34
- data/examples/richtext/syntaxhighlighter/mainwindow.rb +105 -105
- data/examples/ruboids/LICENSE.txt +58 -58
- data/examples/ruboids/Manifest +26 -26
- data/examples/ruboids/README +53 -53
- data/examples/ruboids/TODO +29 -29
- data/examples/ruboids/boids.properties +33 -33
- data/examples/ruboids/generateManifest.rb +42 -42
- data/examples/ruboids/release.rb +152 -152
- data/examples/ruboids/ruboids/Boid.rb +141 -141
- data/examples/ruboids/ruboids/BoidView.rb +159 -159
- data/examples/ruboids/ruboids/Camera.rb +24 -24
- data/examples/ruboids/ruboids/CameraDialog.rb +218 -218
- data/examples/ruboids/ruboids/Canvas.rb +143 -143
- data/examples/ruboids/ruboids/Cloud.rb +61 -61
- data/examples/ruboids/ruboids/CloudView.rb +54 -54
- data/examples/ruboids/ruboids/Flock.rb +47 -47
- data/examples/ruboids/ruboids/Graphics.rb +278 -278
- data/examples/ruboids/ruboids/Params.rb +87 -87
- data/examples/ruboids/ruboids/Point.rb +153 -153
- data/examples/ruboids/ruboids/Thing.rb +34 -34
- data/examples/ruboids/ruboids/Triangle.rb +21 -21
- data/examples/ruboids/ruboids/View.rb +88 -88
- data/examples/ruboids/ruboids/World.rb +82 -82
- data/examples/ruboids/ruboids/WorldWindow.rb +52 -52
- data/examples/ruboids/ruboids/info.rb +12 -12
- data/examples/ruboids/ruboids/ruboids.rb +29 -29
- data/examples/threading/main_thread.rb +19 -19
- data/examples/tutorial/t1/t1.rb +10 -10
- data/examples/tutorial/t10/cannon.rb +72 -72
- data/examples/tutorial/t10/lcdrange.rb +45 -45
- data/examples/tutorial/t10/t10.rb +55 -55
- data/examples/tutorial/t11/cannon.rb +123 -124
- data/examples/tutorial/t11/lcdrange.rb +45 -45
- data/examples/tutorial/t11/t11.rb +65 -65
- data/examples/tutorial/t12/cannon.rb +157 -158
- data/examples/tutorial/t12/lcdrange.rb +58 -59
- data/examples/tutorial/t12/t12.rb +65 -66
- data/examples/tutorial/t13/cannon.rb +206 -208
- data/examples/tutorial/t13/gamebrd.rb +112 -113
- data/examples/tutorial/t13/lcdrange.rb +59 -60
- data/examples/tutorial/t13/t13.rb +11 -11
- data/examples/tutorial/t14/cannon.rb +262 -263
- data/examples/tutorial/t14/gamebrd.rb +122 -123
- data/examples/tutorial/t14/lcdrange.rb +61 -63
- data/examples/tutorial/t14/t14.rb +11 -11
- data/examples/tutorial/t2/t2.rb +16 -16
- data/examples/tutorial/t3/t3.rb +17 -18
- data/examples/tutorial/t4/t4.rb +23 -25
- data/examples/tutorial/t5/t5.rb +35 -37
- data/examples/tutorial/t6/t6.rb +48 -52
- data/examples/tutorial/t7/lcdrange.rb +32 -32
- data/examples/tutorial/t7/t7.rb +40 -42
- data/examples/tutorial/t8/cannon.rb +37 -38
- data/examples/tutorial/t8/lcdrange.rb +45 -45
- data/examples/tutorial/t8/t8.rb +43 -43
- data/examples/tutorial/t9/cannon.rb +44 -45
- data/examples/tutorial/t9/lcdrange.rb +46 -46
- data/examples/tutorial/t9/t9.rb +43 -43
- data/examples/widgets/analogclock/analogclock.rb +94 -94
- data/examples/widgets/analogclock/main.rb +9 -9
- data/examples/widgets/calculator/button.rb +45 -45
- data/examples/widgets/calculator/calculator.rb +382 -382
- data/examples/widgets/calculator/main.rb +32 -32
- data/examples/widgets/charactermap/characterwidget.rb +109 -109
- data/examples/widgets/charactermap/main.rb +32 -32
- data/examples/widgets/charactermap/mainwindow.rb +118 -118
- data/examples/widgets/digitalclock/digitalclock.rb +30 -30
- data/examples/widgets/digitalclock/main.rb +9 -9
- data/examples/widgets/groupbox/main.rb +32 -32
- data/examples/widgets/groupbox/window.rb +134 -134
- data/examples/widgets/icons/iconpreviewarea.rb +110 -110
- data/examples/widgets/icons/iconsizespinbox.rb +39 -39
- data/examples/widgets/icons/imagedelegate.rb +73 -73
- data/examples/widgets/icons/main.rb +32 -32
- data/examples/widgets/icons/mainwindow.rb +351 -351
- data/examples/widgets/imageviewer/imageviewer.rb +219 -219
- data/examples/widgets/imageviewer/main.rb +32 -32
- data/examples/widgets/lineedits/main.rb +32 -32
- data/examples/widgets/lineedits/window.rb +199 -199
- data/examples/widgets/movie/main.rb +32 -32
- data/examples/widgets/movie/movieplayer.rb +201 -201
- data/examples/widgets/screenshot/main.rb +32 -32
- data/examples/widgets/screenshot/screenshot.rb +154 -154
- data/examples/widgets/scribble/main.rb +32 -32
- data/examples/widgets/scribble/mainwindow.rb +202 -202
- data/examples/widgets/scribble/scribblearea.rb +154 -154
- data/examples/widgets/sliders/main.rb +32 -32
- data/examples/widgets/sliders/slidersgroup.rb +97 -97
- data/examples/widgets/sliders/window.rb +124 -124
- data/examples/widgets/spinboxes/main.rb +32 -32
- data/examples/widgets/spinboxes/window.rb +213 -213
- data/examples/widgets/tetrix/main.rb +33 -33
- data/examples/widgets/tetrix/tetrixboard.rb +346 -346
- data/examples/widgets/tetrix/tetrixpiece.rb +135 -135
- data/examples/widgets/tetrix/tetrixwindow.rb +88 -88
- data/examples/widgets/tooltips/main.rb +32 -32
- data/examples/widgets/tooltips/shapeitem.rb +31 -31
- data/examples/widgets/tooltips/sortingbox.rb +222 -222
- data/examples/widgets/wiggly/dialog.rb +48 -48
- data/examples/widgets/wiggly/main.rb +9 -9
- data/examples/widgets/wiggly/wigglywidget.rb +75 -75
- data/examples/widgets/windowflags/controllerwindow.rb +195 -195
- data/examples/widgets/windowflags/main.rb +32 -32
- data/examples/widgets/windowflags/previewwindow.rb +103 -103
- data/examples/xml/dombookmarks/frank.xbel +230 -230
- data/examples/xml/dombookmarks/jennifer.xbel +93 -93
- data/examples/xml/dombookmarks/main.rb +34 -34
- data/examples/xml/dombookmarks/mainwindow.rb +129 -129
- data/examples/xml/dombookmarks/xbeltree.rb +172 -172
- data/examples/xml/saxbookmarks/frank.xbel +230 -230
- data/examples/xml/saxbookmarks/jennifer.xbel +93 -93
- data/examples/xml/saxbookmarks/main.rb +34 -34
- data/examples/xml/saxbookmarks/mainwindow.rb +144 -144
- data/examples/xml/saxbookmarks/xbelgenerator.rb +95 -95
- data/examples/xml/saxbookmarks/xbelhandler.rb +122 -122
- data/ext/cmake/modules/BasicFindPackageVersion.cmake.in +30 -30
- data/ext/cmake/modules/CMakeCSharpCompiler.cmake.in +7 -7
- data/ext/cmake/modules/CMakeCSharpInformation.cmake +366 -366
- data/ext/cmake/modules/CMakeDetermineCSharpCompiler.cmake +85 -85
- data/ext/cmake/modules/CMakeTestCSharpCompiler.cmake +1 -1
- data/ext/cmake/modules/FindLibraryWithDebug.cmake +113 -113
- data/ext/cmake/modules/FindMono.cmake +36 -36
- data/ext/cmake/modules/FindPHP5.cmake +179 -179
- data/ext/cmake/modules/FindPerlMore.cmake +78 -78
- data/ext/cmake/modules/FindPhonon.cmake +71 -71
- data/ext/cmake/modules/FindQImageBlitz.cmake +51 -51
- data/ext/cmake/modules/FindQScintilla.cmake +57 -57
- data/ext/cmake/modules/FindQwt5.cmake +104 -104
- data/ext/cmake/modules/FindRuby.cmake +279 -279
- data/ext/cmake/modules/FindSmoke.cmake +78 -78
- data/ext/cmake/modules/MacroLogFeature.cmake +146 -146
- data/ext/cmake/modules/MacroOptionalAddBindings.cmake +47 -47
- data/ext/cmake/modules/MacroOptionalFindPackage.cmake +28 -28
- data/ext/cmake/modules/MacroPushRequiredVars.cmake +47 -47
- data/ext/cmake/modules/MacroWriteBasicCMakeVersionFile.cmake +22 -22
- data/ext/cmake/modules/SmokeConfig.cmake.in +109 -109
- data/ext/generator/CMakeLists.txt +38 -38
- data/ext/generator/cmake/BasicFindPackageVersion.cmake.in +30 -30
- data/ext/generator/cmake/CMakeLists.txt +24 -24
- data/ext/generator/cmake/FindLibraryWithDebug.cmake +113 -113
- data/ext/generator/cmake/FindPhonon.cmake +71 -71
- data/ext/generator/cmake/FindQImageBlitz.cmake +51 -51
- data/ext/generator/cmake/FindQScintilla.cmake +57 -57
- data/ext/generator/cmake/FindQwt5.cmake +104 -104
- data/ext/generator/cmake/HandleImportedTargetsInCMakeRequiredLibraries.cmake +85 -85
- data/ext/generator/cmake/MacroLogFeature.cmake +146 -146
- data/ext/generator/cmake/MacroOptionalAddBindings.cmake +47 -47
- data/ext/generator/cmake/MacroOptionalFindPackage.cmake +28 -28
- data/ext/generator/cmake/MacroWriteBasicCMakeVersionFile.cmake +22 -22
- data/ext/generator/cmake/SmokeConfig.cmake.in +109 -109
- data/ext/generator/config.h +25 -25
- data/ext/generator/generator_export.h +31 -31
- data/ext/generator/generatorenvironment.cpp +52 -52
- data/ext/generator/generatorenvironment.h +35 -35
- data/ext/generator/generatorpreprocessor.cpp +303 -303
- data/ext/generator/generatorpreprocessor.h +83 -83
- data/ext/generator/generators/CMakeLists.txt +4 -4
- data/ext/generator/generators/dump/CMakeLists.txt +15 -15
- data/ext/generator/generators/dump/generator_dump.cpp +36 -36
- data/ext/generator/generators/smoke/CMakeLists.txt +18 -18
- data/ext/generator/generators/smoke/generator_smoke.cpp +240 -240
- data/ext/generator/generators/smoke/globals.h +140 -140
- data/ext/generator/generators/smoke/helpers.cpp +793 -793
- data/ext/generator/generators/smoke/writeClasses.cpp +502 -502
- data/ext/generator/generators/smoke/writeSmokeDataFile.cpp +754 -754
- data/ext/generator/generatorvisitor.cpp +922 -922
- data/ext/generator/generatorvisitor.h +119 -119
- data/ext/generator/name_compiler.cpp +205 -205
- data/ext/generator/name_compiler.h +76 -76
- data/ext/generator/options.cpp +33 -33
- data/ext/generator/options.h +46 -46
- data/ext/generator/parser/CMakeLists.txt +50 -50
- data/ext/generator/parser/ast.cpp +21 -21
- data/ext/generator/parser/ast.h +923 -923
- data/ext/generator/parser/astutilities.h +65 -65
- data/ext/generator/parser/codegenerator.cpp +867 -867
- data/ext/generator/parser/codegenerator.h +180 -180
- data/ext/generator/parser/codemodel_fwd.h +76 -76
- data/ext/generator/parser/commentformatter.cpp +54 -54
- data/ext/generator/parser/commentformatter.h +45 -45
- data/ext/generator/parser/commentparser.cpp +109 -109
- data/ext/generator/parser/commentparser.h +84 -84
- data/ext/generator/parser/control.cpp +40 -40
- data/ext/generator/parser/control.h +51 -51
- data/ext/generator/parser/cppparser_export.h +33 -33
- data/ext/generator/parser/default_visitor.cpp +470 -470
- data/ext/generator/parser/default_visitor.h +116 -116
- data/ext/generator/parser/dumptree.cpp +146 -146
- data/ext/generator/parser/dumptree.h +50 -50
- data/ext/generator/parser/indexedstring.cpp +213 -213
- data/ext/generator/parser/indexedstring.h +147 -147
- data/ext/generator/parser/kdevelop-parser-rev +1 -1
- data/ext/generator/parser/kdevvarlengtharray.h +346 -346
- data/ext/generator/parser/lexer.cpp +964 -964
- data/ext/generator/parser/lexer.h +308 -308
- data/ext/generator/parser/listnode.cpp +20 -20
- data/ext/generator/parser/listnode.h +97 -97
- data/ext/generator/parser/memorypool.cpp +20 -20
- data/ext/generator/parser/memorypool.h +41 -41
- data/ext/generator/parser/name_compiler.cpp +190 -190
- data/ext/generator/parser/name_compiler.h +77 -77
- data/ext/generator/parser/parser.cpp +4708 -4708
- data/ext/generator/parser/parser.h +290 -290
- data/ext/generator/parser/parsesession.cpp +106 -106
- data/ext/generator/parser/parsesession.h +87 -87
- data/ext/generator/parser/problem.h +21 -21
- data/ext/generator/parser/rpp/CMakeLists.txt +45 -45
- data/ext/generator/parser/rpp/Makefile.am +13 -13
- data/ext/generator/parser/rpp/anchor.h +51 -51
- data/ext/generator/parser/rpp/appendedlist.h +363 -363
- data/ext/generator/parser/rpp/chartools.cpp +146 -146
- data/ext/generator/parser/rpp/chartools.h +99 -99
- data/ext/generator/parser/rpp/macrorepository.cpp +44 -44
- data/ext/generator/parser/rpp/macrorepository.h +59 -59
- data/ext/generator/parser/rpp/pp-configuration +86 -86
- data/ext/generator/parser/rpp/pp-engine.h +267 -267
- data/ext/generator/parser/rpp/pp-environment.cpp +271 -271
- data/ext/generator/parser/rpp/pp-environment.h +119 -119
- data/ext/generator/parser/rpp/pp-internal.cpp +38 -38
- data/ext/generator/parser/rpp/pp-internal.h +37 -37
- data/ext/generator/parser/rpp/pp-location.cpp +191 -191
- data/ext/generator/parser/rpp/pp-location.h +89 -89
- data/ext/generator/parser/rpp/pp-macro-expander.cpp +568 -568
- data/ext/generator/parser/rpp/pp-macro-expander.cpp.orig +558 -558
- data/ext/generator/parser/rpp/pp-macro-expander.h +130 -130
- data/ext/generator/parser/rpp/pp-macro.cpp +153 -153
- data/ext/generator/parser/rpp/pp-macro.h +176 -176
- data/ext/generator/parser/rpp/pp-scanner.cpp +311 -311
- data/ext/generator/parser/rpp/pp-scanner.h +97 -97
- data/ext/generator/parser/rpp/pp-stream.cpp +425 -425
- data/ext/generator/parser/rpp/pp-stream.h +183 -183
- data/ext/generator/parser/rpp/preprocessor.cpp +65 -65
- data/ext/generator/parser/rpp/preprocessor.h +80 -80
- data/ext/generator/parser/rpp/rpp.pri +2 -2
- data/ext/generator/parser/rpp/test/t001.cpp +23 -23
- data/ext/generator/parser/rpp/test/t002.cpp +15 -15
- data/ext/generator/parser/rpp/test/t003.cpp +10 -10
- data/ext/generator/parser/rpp/test/t004.cpp +9 -9
- data/ext/generator/parser/rpp/test/t005.cpp +10 -10
- data/ext/generator/parser/rpp/test/t006.cpp +10 -10
- data/ext/generator/parser/rpp/test/t007.cpp +6 -6
- data/ext/generator/parser/rpp/test/t008.cpp +6 -6
- data/ext/generator/parser/rpp/test/t009.cpp +5 -5
- data/ext/generator/parser/rpp/test/t010.cpp +15 -15
- data/ext/generator/parser/rpp/test/t011.cpp +9 -9
- data/ext/generator/parser/rpp/tests/CMakeLists.txt +17 -17
- data/ext/generator/parser/rpp/tests/main.cpp +69 -69
- data/ext/generator/parser/rxx.pri +50 -50
- data/ext/generator/parser/rxx_allocator.h +128 -128
- data/ext/generator/parser/safetycounter.h +57 -57
- data/ext/generator/parser/simplecursor.h +74 -74
- data/ext/generator/parser/stringhelpers.cpp +577 -577
- data/ext/generator/parser/stringhelpers.h +118 -118
- data/ext/generator/parser/symbol.h +140 -140
- data/ext/generator/parser/tests/CMakeLists.txt +46 -46
- data/ext/generator/parser/tests/test_generator.cpp +259 -259
- data/ext/generator/parser/tests/test_parser.cpp +474 -474
- data/ext/generator/parser/tests/test_pool.cpp +109 -109
- data/ext/generator/parser/tests/test_pool.h +35 -35
- data/ext/generator/parser/tests/testconfig.h.cmake +4 -4
- data/ext/generator/parser/tokens.cpp +367 -367
- data/ext/generator/parser/tokens.h +148 -148
- data/ext/generator/parser/type_compiler.cpp +135 -135
- data/ext/generator/parser/type_compiler.h +68 -68
- data/ext/generator/parser/visitor.cpp +115 -115
- data/ext/generator/parser/visitor.h +138 -138
- data/ext/generator/smoke.h +557 -557
- data/ext/generator/smokegen_string.h +43 -43
- data/ext/generator/type.cpp +204 -204
- data/ext/generator/type.h +497 -497
- data/ext/generator/type_compiler.cpp +277 -277
- data/ext/generator/type_compiler.h +80 -80
- data/ext/ruby/CMakeLists.txt +64 -64
- data/ext/ruby/qtdeclarative/CMakeLists.txt +17 -17
- data/ext/ruby/qtdeclarative/qtdeclarative.cpp +67 -67
- data/ext/ruby/qtdeclarative/qtdeclarative.rb +17 -17
- data/ext/ruby/qtdeclarative/qtdeclarativehandlers.cpp +36 -36
- data/ext/ruby/qtruby/AUTHORS +54 -54
- data/ext/ruby/qtruby/COPYING +355 -355
- data/ext/ruby/qtruby/COPYING.LIB +510 -510
- data/ext/ruby/qtruby/ChangeLog +3732 -3732
- data/ext/ruby/qtruby/INSTALL +79 -79
- data/ext/ruby/qtruby/README +264 -264
- data/ext/ruby/qtruby/TODO +8 -8
- data/ext/ruby/qtruby/bin/rbqtapi +152 -152
- data/ext/ruby/qtruby/rails_support/CMakeLists.txt +1 -1
- data/ext/ruby/qtruby/rails_support/active_item_model.rb +234 -234
- data/ext/ruby/qtruby/rails_support/active_table_model.rb +122 -122
- data/ext/ruby/qtruby/src/marshall_basetypes.h +208 -208
- data/ext/ruby/qtruby/src/marshall_complex.h +175 -175
- data/ext/ruby/qtruby/src/marshall_macros.h +647 -647
- data/ext/ruby/qtruby/src/marshall_types.cpp +815 -815
- data/ext/ruby/qtruby/src/marshall_types.h +240 -240
- data/ext/ruby/qtruby/src/qtruby.cpp +1 -1
- data/ext/ruby/qtruby/test/opoverloading.rb +46 -46
- data/ext/ruby/qtruby/test/unittests.rb +151 -151
- data/ext/ruby/qtruby/tools/rbrcc/main.cpp +173 -173
- data/ext/ruby/qtruby/tools/rbrcc/rbrcc.pro +14 -14
- data/ext/ruby/qtruby/tools/rbrcc/rcc.cpp +648 -648
- data/ext/ruby/qtruby/tools/rbrcc/rcc.h +165 -165
- data/ext/ruby/qtruby/tools/rbuic/LICENSE.GPL +280 -280
- data/ext/ruby/qtruby/tools/rbuic/TODO +4 -4
- data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.cpp +106 -106
- data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.h +95 -95
- data/ext/ruby/qtruby/tools/rbuic/databaseinfo.cpp +102 -102
- data/ext/ruby/qtruby/tools/rbuic/databaseinfo.h +85 -85
- data/ext/ruby/qtruby/tools/rbuic/driver.cpp +384 -384
- data/ext/ruby/qtruby/tools/rbuic/driver.h +141 -141
- data/ext/ruby/qtruby/tools/rbuic/rbuic.pri +23 -23
- data/ext/ruby/qtruby/tools/rbuic/rbuic4.pro +43 -43
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.cpp +150 -150
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.h +83 -83
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.cpp +217 -217
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.h +85 -85
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.cpp +185 -185
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.h +86 -86
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.cpp +88 -88
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.h +83 -83
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.cpp +126 -126
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.h +87 -87
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.cpp +2478 -2478
- data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.h +314 -314
- data/ext/ruby/qtruby/tools/rbuic/ruby/ruby.pri +18 -18
- data/ext/ruby/qtruby/tools/rbuic/treewalker.cpp +318 -318
- data/ext/ruby/qtruby/tools/rbuic/treewalker.h +139 -139
- data/ext/ruby/qtruby/tools/rbuic/ui4.cpp +7623 -7623
- data/ext/ruby/qtruby/tools/rbuic/ui4.h +3180 -3180
- data/ext/ruby/qtruby/tools/rbuic/utils.h +125 -125
- data/ext/ruby/qtruby/tools/rbuic/validator.cpp +100 -100
- data/ext/ruby/qtruby/tools/rbuic/validator.h +80 -80
- data/ext/ruby/qtscript/CMakeLists.txt +19 -19
- data/ext/ruby/qtscript/qtscript.cpp +83 -83
- data/ext/ruby/qtscript/qtscript.rb +40 -40
- data/ext/ruby/qtscript/qtscripthandlers.cpp +37 -37
- data/ext/ruby/qtscript/smokedata.cpp +1403 -1403
- data/ext/ruby/qttest/CMakeLists.txt +18 -18
- data/ext/ruby/qttest/ChangeLog +9 -9
- data/ext/ruby/qttest/examples/myfirsttest.rb +30 -30
- data/ext/ruby/qttest/qttest.cpp +83 -83
- data/ext/ruby/qttest/qttest.rb +166 -166
- data/ext/ruby/qttest/qttesthandlers.cpp +37 -37
- data/ext/ruby/qtuitools/CMakeLists.txt +16 -16
- data/ext/ruby/qtuitools/qtuitools.cpp +83 -83
- data/ext/ruby/qtuitools/qtuitools.rb +17 -17
- data/ext/ruby/qtuitools/qtuitoolshandlers.cpp +32 -32
- data/ext/ruby/qtwebkit/CMakeLists.txt +17 -17
- data/ext/ruby/qtwebkit/qtwebkit.cpp +67 -67
- data/ext/ruby/qtwebkit/qtwebkit.rb +17 -17
- data/ext/ruby/qtwebkit/qtwebkithandlers.cpp +40 -40
- data/ext/smoke/deptool/CMakeLists.txt +7 -7
- data/ext/smoke/deptool/main.cpp +128 -128
- data/ext/smoke/qtcore/CMakeLists.txt +88 -88
- data/ext/smoke/qtcore/QtGuess.txt +180 -180
- data/ext/smoke/qtcore/config.xml.cmake +10 -10
- data/ext/smoke/qtcore/qt-config.xml.cmake +21 -21
- data/ext/smoke/qtcore/qtcore_includes.h +1 -1
- data/ext/smoke/qtcore/smokeconfig.xml +193 -193
- data/ext/smoke/qtcore/tests/CMakeLists.txt +13 -13
- data/ext/smoke/qtcore/tests/test.cpp +846 -846
- data/ext/smoke/qtcore_smoke.h +16 -16
- data/ext/smoke/qtdbus/CMakeLists.txt +38 -38
- data/ext/smoke/qtdbus/config.xml.cmake +11 -11
- data/ext/smoke/qtdbus/qtdbus_includes.h +2 -2
- data/ext/smoke/qtdbus/smokeconfig.xml +65 -65
- data/ext/smoke/qtdbus_smoke.h +16 -16
- data/ext/smoke/qtdeclarative/CMakeLists.txt +45 -45
- data/ext/smoke/qtdeclarative/config.xml.cmake +12 -12
- data/ext/smoke/qtdeclarative/qtdeclarative_includes.h +3 -3
- data/ext/smoke/qtdeclarative/smokeconfig.xml +59 -59
- data/ext/smoke/qtdeclarative_smoke.h +16 -16
- data/ext/smoke/qtgui/CMakeLists.txt +76 -76
- data/ext/smoke/qtgui/config.xml.cmake +11 -11
- data/ext/smoke/qtgui/qtgui_includes.h +7 -7
- data/ext/smoke/qtgui/smokeconfig.xml +500 -500
- data/ext/smoke/qtgui_smoke.h +16 -16
- data/ext/smoke/qthelp/CMakeLists.txt +45 -45
- data/ext/smoke/qthelp/config.xml.cmake +13 -13
- data/ext/smoke/qthelp/qthelp_includes.h +3 -3
- data/ext/smoke/qthelp/smokeconfig.xml +54 -54
- data/ext/smoke/qthelp_smoke.h +16 -16
- data/ext/smoke/qtmultimedia/CMakeLists.txt +42 -42
- data/ext/smoke/qtmultimedia/config.xml.cmake +12 -12
- data/ext/smoke/qtmultimedia/qtmultimedia_includes.h +3 -3
- data/ext/smoke/qtmultimedia/smokeconfig.xml +51 -51
- data/ext/smoke/qtmultimedia_smoke.h +16 -16
- data/ext/smoke/qtnetwork/CMakeLists.txt +38 -38
- data/ext/smoke/qtnetwork/config.xml.cmake +11 -11
- data/ext/smoke/qtnetwork/qtnetwork_includes.h +2 -2
- data/ext/smoke/qtnetwork/smokeconfig.xml +81 -81
- data/ext/smoke/qtnetwork_smoke.h +16 -16
- data/ext/smoke/qtopengl/CMakeLists.txt +43 -43
- data/ext/smoke/qtopengl/config.xml.cmake +13 -13
- data/ext/smoke/qtopengl/qtopengl_includes.h +3 -3
- data/ext/smoke/qtopengl/smokeconfig.xml +58 -58
- data/ext/smoke/qtopengl_smoke.h +16 -16
- data/ext/smoke/qtscript/CMakeLists.txt +31 -31
- data/ext/smoke/qtscript/config.xml.cmake +11 -11
- data/ext/smoke/qtscript/qtscript_includes.h +14 -14
- data/ext/smoke/qtscript/smokeconfig.xml +39 -39
- data/ext/smoke/qtscript_smoke.h +16 -16
- data/ext/smoke/qtsql/CMakeLists.txt +45 -45
- data/ext/smoke/qtsql/config.xml.cmake +11 -11
- data/ext/smoke/qtsql/qtsql_includes.h +3 -3
- data/ext/smoke/qtsql/smokeconfig.xml +60 -60
- data/ext/smoke/qtsql_smoke.h +16 -16
- data/ext/smoke/qtsvg/CMakeLists.txt +43 -43
- data/ext/smoke/qtsvg/config.xml.cmake +12 -12
- data/ext/smoke/qtsvg/qtsvg_includes.h +3 -3
- data/ext/smoke/qtsvg/smokeconfig.xml +46 -46
- data/ext/smoke/qtsvg_smoke.h +16 -16
- data/ext/smoke/qttest/CMakeLists.txt +35 -35
- data/ext/smoke/qttest/config.xml.cmake +12 -12
- data/ext/smoke/qttest/qttest_includes.h +14 -14
- data/ext/smoke/qttest/smokeconfig.xml +36 -36
- data/ext/smoke/qttest_smoke.h +16 -16
- data/ext/smoke/qtuitools/CMakeLists.txt +30 -30
- data/ext/smoke/qtuitools/config.xml.cmake +12 -12
- data/ext/smoke/qtuitools/qtuitools_includes.h +1 -1
- data/ext/smoke/qtuitools/smokeconfig.xml +20 -20
- data/ext/smoke/qtuitools_smoke.h +16 -16
- data/ext/smoke/qtwebkit/CMakeLists.txt +36 -36
- data/ext/smoke/qtwebkit/config.xml.cmake +11 -11
- data/ext/smoke/qtwebkit/qtwebkit_includes.h +1 -1
- data/ext/smoke/qtwebkit/smokeconfig.xml +48 -48
- data/ext/smoke/qtwebkit_smoke.h +16 -16
- data/ext/smoke/qtxml/CMakeLists.txt +41 -41
- data/ext/smoke/qtxml/config.xml.cmake +11 -11
- data/ext/smoke/qtxml/qtxml_includes.h +2 -2
- data/ext/smoke/qtxml/smokeconfig.xml +70 -70
- data/ext/smoke/qtxml_smoke.h +16 -16
- data/ext/smoke/qtxmlpatterns/CMakeLists.txt +42 -42
- data/ext/smoke/qtxmlpatterns/config.xml.cmake +12 -12
- data/ext/smoke/qtxmlpatterns/qtxmlpatterns_includes.h +3 -3
- data/ext/smoke/qtxmlpatterns/smokeconfig.xml +80 -80
- data/ext/smoke/qtxmlpatterns_smoke.h +16 -16
- data/ext/smoke/smokeapi/CMakeLists.txt +9 -9
- data/ext/smoke/smokeapi/main.cpp +309 -309
- data/ext/smoke/smokebase/CMakeLists.txt +11 -11
- data/ext/smoke/smokebase/smokebase.cpp +6 -6
- data/ext/smoke/solid_smoke.h +16 -16
- data/lib/Qt.rb +1 -1
- data/lib/Qt4.rb +119 -111
- data/lib/qtbindings_version.rb +2 -2
- data/lib/qtdeclarative/qtdeclarative.rb +17 -17
- data/lib/qtscript/qtscript.rb +40 -40
- data/lib/qttest/qttest.rb +166 -166
- data/lib/qtuitools/qtuitools.rb +17 -17
- data/lib/qtwebkit/qtwebkit.rb +17 -17
- metadata +6 -7
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Copyright 2007 Hamish Rodda <rodda@kde.org>
|
|
3
|
-
Copyright 2008-2009 David Nolden <david.nolden.kdevelop@art-master.de>
|
|
4
|
-
|
|
5
|
-
Permission to use, copy, modify, distribute, and sell this software and its
|
|
6
|
-
documentation for any purpose is hereby granted without fee, provided that
|
|
7
|
-
the above copyright notice appear in all copies and that both that
|
|
8
|
-
copyright notice and this permission notice appear in supporting
|
|
9
|
-
documentation.
|
|
10
|
-
|
|
11
|
-
The above copyright notice and this permission notice shall be included in
|
|
12
|
-
all copies or substantial portions of the Software.
|
|
13
|
-
|
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
-
KDEVELOP TEAM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
18
|
-
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
19
|
-
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
#ifndef PP_LOCATION_H
|
|
23
|
-
#define PP_LOCATION_H
|
|
24
|
-
|
|
25
|
-
#include <QMap>
|
|
26
|
-
#include <QVector>
|
|
27
|
-
#include <QPair>
|
|
28
|
-
|
|
29
|
-
#include "../cppparser_export.h"
|
|
30
|
-
#include "../simplecursor.h"
|
|
31
|
-
|
|
32
|
-
#include "anchor.h"
|
|
33
|
-
|
|
34
|
-
typedef QVector<unsigned int> PreprocessedContents;
|
|
35
|
-
|
|
36
|
-
namespace rpp {
|
|
37
|
-
|
|
38
|
-
class CPPPARSER_EXPORT LocationTable
|
|
39
|
-
{
|
|
40
|
-
public:
|
|
41
|
-
LocationTable();
|
|
42
|
-
|
|
43
|
-
/// Generates the location table from the contents
|
|
44
|
-
LocationTable(const PreprocessedContents& contents);
|
|
45
|
-
|
|
46
|
-
///@param contents is allowed to be zero only if offset is zero, or if anchor.column is zero.
|
|
47
|
-
void anchor(std::size_t offset, Anchor anchor, const PreprocessedContents* contents);
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Return the position of the preprocessed source \a offset in the original source
|
|
51
|
-
* If the "collapsed" member of the returned anchor is true, the position is within a collapsed range.
|
|
52
|
-
@param collapseIfMacroExpansion @see LocationTable::positionForOffset
|
|
53
|
-
* \note the return line starts from 0, not 1.
|
|
54
|
-
* Returns the found position stored in the anchor, and the possible maximum length until the next anchored position, or zero.
|
|
55
|
-
*/
|
|
56
|
-
QPair<rpp::Anchor, uint> positionAt(std::size_t offset, const PreprocessedContents& contents, bool collapseIfMacroExpansion = false) const;
|
|
57
|
-
|
|
58
|
-
struct AnchorInTable {
|
|
59
|
-
uint position; //Position of this anchor
|
|
60
|
-
Anchor anchor; //This anchor
|
|
61
|
-
uint nextPosition;//Position of the next following anchor, or zero
|
|
62
|
-
Anchor nextAnchor;//The next following anchor
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Returns the nearest anchor before @param position, and the position of the anchor.
|
|
67
|
-
* If the character is in a collapsed range, the collapsed member is true.
|
|
68
|
-
@param collapseIfMacroExpansion When this is true, all ranges that come from macro-expansion will be
|
|
69
|
-
considered collapsed.(The returned anchor will also have the collapsed member set)
|
|
70
|
-
* */
|
|
71
|
-
AnchorInTable anchorForOffset(std::size_t position, bool collapseIfMacroExpansion = false) const;
|
|
72
|
-
|
|
73
|
-
void dump() const;
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Splits the given @param text using this location-table into sub-strings each assigned to a cursor where it starts.
|
|
77
|
-
* @param textStartPosition must be given as the start-position, because the location-table might not contain an anchor
|
|
78
|
-
* for the first character.
|
|
79
|
-
* */
|
|
80
|
-
void splitByAnchors(const PreprocessedContents& text, const Anchor& textStartPosition, QList<PreprocessedContents>& strings, QList<Anchor>& anchors) const;
|
|
81
|
-
|
|
82
|
-
private:
|
|
83
|
-
QMap<std::size_t, Anchor> m_offsetTable;
|
|
84
|
-
mutable QMap<std::size_t, Anchor>::ConstIterator m_currentOffset;
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
#endif // PP_LOCATION_H
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2007 Hamish Rodda <rodda@kde.org>
|
|
3
|
+
Copyright 2008-2009 David Nolden <david.nolden.kdevelop@art-master.de>
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, distribute, and sell this software and its
|
|
6
|
+
documentation for any purpose is hereby granted without fee, provided that
|
|
7
|
+
the above copyright notice appear in all copies and that both that
|
|
8
|
+
copyright notice and this permission notice appear in supporting
|
|
9
|
+
documentation.
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be included in
|
|
12
|
+
all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
KDEVELOP TEAM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
18
|
+
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
19
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
#ifndef PP_LOCATION_H
|
|
23
|
+
#define PP_LOCATION_H
|
|
24
|
+
|
|
25
|
+
#include <QMap>
|
|
26
|
+
#include <QVector>
|
|
27
|
+
#include <QPair>
|
|
28
|
+
|
|
29
|
+
#include "../cppparser_export.h"
|
|
30
|
+
#include "../simplecursor.h"
|
|
31
|
+
|
|
32
|
+
#include "anchor.h"
|
|
33
|
+
|
|
34
|
+
typedef QVector<unsigned int> PreprocessedContents;
|
|
35
|
+
|
|
36
|
+
namespace rpp {
|
|
37
|
+
|
|
38
|
+
class CPPPARSER_EXPORT LocationTable
|
|
39
|
+
{
|
|
40
|
+
public:
|
|
41
|
+
LocationTable();
|
|
42
|
+
|
|
43
|
+
/// Generates the location table from the contents
|
|
44
|
+
LocationTable(const PreprocessedContents& contents);
|
|
45
|
+
|
|
46
|
+
///@param contents is allowed to be zero only if offset is zero, or if anchor.column is zero.
|
|
47
|
+
void anchor(std::size_t offset, Anchor anchor, const PreprocessedContents* contents);
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Return the position of the preprocessed source \a offset in the original source
|
|
51
|
+
* If the "collapsed" member of the returned anchor is true, the position is within a collapsed range.
|
|
52
|
+
@param collapseIfMacroExpansion @see LocationTable::positionForOffset
|
|
53
|
+
* \note the return line starts from 0, not 1.
|
|
54
|
+
* Returns the found position stored in the anchor, and the possible maximum length until the next anchored position, or zero.
|
|
55
|
+
*/
|
|
56
|
+
QPair<rpp::Anchor, uint> positionAt(std::size_t offset, const PreprocessedContents& contents, bool collapseIfMacroExpansion = false) const;
|
|
57
|
+
|
|
58
|
+
struct AnchorInTable {
|
|
59
|
+
uint position; //Position of this anchor
|
|
60
|
+
Anchor anchor; //This anchor
|
|
61
|
+
uint nextPosition;//Position of the next following anchor, or zero
|
|
62
|
+
Anchor nextAnchor;//The next following anchor
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Returns the nearest anchor before @param position, and the position of the anchor.
|
|
67
|
+
* If the character is in a collapsed range, the collapsed member is true.
|
|
68
|
+
@param collapseIfMacroExpansion When this is true, all ranges that come from macro-expansion will be
|
|
69
|
+
considered collapsed.(The returned anchor will also have the collapsed member set)
|
|
70
|
+
* */
|
|
71
|
+
AnchorInTable anchorForOffset(std::size_t position, bool collapseIfMacroExpansion = false) const;
|
|
72
|
+
|
|
73
|
+
void dump() const;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Splits the given @param text using this location-table into sub-strings each assigned to a cursor where it starts.
|
|
77
|
+
* @param textStartPosition must be given as the start-position, because the location-table might not contain an anchor
|
|
78
|
+
* for the first character.
|
|
79
|
+
* */
|
|
80
|
+
void splitByAnchors(const PreprocessedContents& text, const Anchor& textStartPosition, QList<PreprocessedContents>& strings, QList<Anchor>& anchors) const;
|
|
81
|
+
|
|
82
|
+
private:
|
|
83
|
+
QMap<std::size_t, Anchor> m_offsetTable;
|
|
84
|
+
mutable QMap<std::size_t, Anchor>::ConstIterator m_currentOffset;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#endif // PP_LOCATION_H
|
|
@@ -1,568 +1,568 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Copyright 2005 Roberto Raggi <roberto@kdevelop.org>
|
|
3
|
-
Copyright 2006 Hamish Rodda <rodda@kde.org>
|
|
4
|
-
Copyright 2007-2009 David Nolden <david.nolden.kdevelop@art-master.de>
|
|
5
|
-
|
|
6
|
-
Permission to use, copy, modify, distribute, and sell this software and its
|
|
7
|
-
documentation for any purpose is hereby granted without fee, provided that
|
|
8
|
-
the above copyright notice appear in all copies and that both that
|
|
9
|
-
copyright notice and this permission notice appear in supporting
|
|
10
|
-
documentation.
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in
|
|
13
|
-
all copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
KDEVELOP TEAM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
19
|
-
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
-
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
#include "pp-macro-expander.h"
|
|
24
|
-
|
|
25
|
-
#include <QDate>
|
|
26
|
-
#include <QTime>
|
|
27
|
-
#include <QtDebug>
|
|
28
|
-
|
|
29
|
-
#include "../problem.h"
|
|
30
|
-
#include "../indexedstring.h"
|
|
31
|
-
|
|
32
|
-
#include "pp-internal.h"
|
|
33
|
-
#include "pp-engine.h"
|
|
34
|
-
#include "pp-environment.h"
|
|
35
|
-
#include "pp-location.h"
|
|
36
|
-
#include "preprocessor.h"
|
|
37
|
-
#include "chartools.h"
|
|
38
|
-
|
|
39
|
-
const int maxMacroExpansionDepth = 50;
|
|
40
|
-
|
|
41
|
-
QString joinIndexVector(const uint* arrays, uint size, QString between) {
|
|
42
|
-
QString ret;
|
|
43
|
-
FOREACH_CUSTOM(uint item, arrays, size) {
|
|
44
|
-
if(!ret.isEmpty())
|
|
45
|
-
ret += between;
|
|
46
|
-
ret += IndexedString::fromIndex(item).str();
|
|
47
|
-
}
|
|
48
|
-
return ret;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
QString joinIndexVector(const QVector<IndexedString>& list, QString between) {
|
|
52
|
-
QString ret;
|
|
53
|
-
foreach(const IndexedString& item, list) {
|
|
54
|
-
if(!ret.isEmpty())
|
|
55
|
-
ret += between;
|
|
56
|
-
ret += item.str();
|
|
57
|
-
}
|
|
58
|
-
return ret;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
void trim(QVector<uint>& array) {
|
|
62
|
-
int lastValid = array.size()-1;
|
|
63
|
-
for(; lastValid >= 0; --lastValid)
|
|
64
|
-
if(array[lastValid] != indexFromCharacter(' '))
|
|
65
|
-
break;
|
|
66
|
-
|
|
67
|
-
array.resize(lastValid+1);
|
|
68
|
-
|
|
69
|
-
int firstValid = 0;
|
|
70
|
-
for(; firstValid < array.size(); ++firstValid)
|
|
71
|
-
if(array[firstValid] != indexFromCharacter(' '))
|
|
72
|
-
break;
|
|
73
|
-
array = array.mid(firstValid);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
using namespace rpp;
|
|
77
|
-
|
|
78
|
-
pp_frame::pp_frame(pp_macro* __expandingMacro, const QList<pp_actual>& __actuals)
|
|
79
|
-
: depth(0)
|
|
80
|
-
, expandingMacro(__expandingMacro)
|
|
81
|
-
, actuals(__actuals)
|
|
82
|
-
{
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
pp_actual pp_macro_expander::resolve_formal(IndexedString name, Stream& input)
|
|
86
|
-
{
|
|
87
|
-
if (!m_frame)
|
|
88
|
-
return pp_actual();
|
|
89
|
-
|
|
90
|
-
Q_ASSERT(m_frame->expandingMacro != 0);
|
|
91
|
-
|
|
92
|
-
const QVector<IndexedString>& formals = m_frame->expandingMacro->formals;
|
|
93
|
-
uint formalsSize = formals.size();
|
|
94
|
-
|
|
95
|
-
if(name.isEmpty()) {
|
|
96
|
-
Problem *problem = new Problem;
|
|
97
|
-
problem->file = m_engine->currentFileNameString();
|
|
98
|
-
problem->position = input.originalInputPosition();
|
|
99
|
-
problem->description = "Macro error";
|
|
100
|
-
m_engine->problemEncountered(problem);
|
|
101
|
-
return pp_actual();
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
for (uint index = 0; index < formalsSize; ++index) {
|
|
105
|
-
if (name.index() == formals[index].index()) {
|
|
106
|
-
if (index < (uint)m_frame->actuals.size()) {
|
|
107
|
-
return m_frame->actuals[index];
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
Problem *problem = new Problem;
|
|
111
|
-
problem->file = m_engine->currentFileNameString();
|
|
112
|
-
problem->position = input.originalInputPosition();
|
|
113
|
-
problem->description = QString("Call to macro %1 missing argument number %2").arg(name.str()).arg(index);
|
|
114
|
-
problem->explanation = QString("Formals: %1").arg(joinIndexVector(formals, ", "));
|
|
115
|
-
m_engine->problemEncountered(problem);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return pp_actual();
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
#define RETURN_IF_INPUT_BROKEN if(input.atEnd()) { qDebug() << "too early end while expanding" << macro->name.str(); return; }
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
pp_macro_expander::pp_macro_expander(pp* engine, pp_frame* frame, bool inHeaderSection)
|
|
127
|
-
: m_engine(engine)
|
|
128
|
-
, m_frame(frame)
|
|
129
|
-
, m_in_header_section(inHeaderSection)
|
|
130
|
-
, m_search_significant_content(false)
|
|
131
|
-
, m_found_significant_content(false)
|
|
132
|
-
{
|
|
133
|
-
if(m_in_header_section)
|
|
134
|
-
m_search_significant_content = true; //Find the end of the header section
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
//A header-section ends when the first non-directive and non-comment occurs
|
|
138
|
-
#define check_header_section \
|
|
139
|
-
if( m_search_significant_content ) \
|
|
140
|
-
{ \
|
|
141
|
-
\
|
|
142
|
-
if(m_in_header_section) { \
|
|
143
|
-
m_in_header_section = false; \
|
|
144
|
-
m_engine->preprocessor()->headerSectionEnded(input); \
|
|
145
|
-
} \
|
|
146
|
-
m_found_significant_content = true; \
|
|
147
|
-
m_search_significant_content = false; \
|
|
148
|
-
if( input.atEnd() ) \
|
|
149
|
-
continue; \
|
|
150
|
-
} \
|
|
151
|
-
|
|
152
|
-
struct EnableMacroExpansion {
|
|
153
|
-
EnableMacroExpansion(Stream& _input, const SimpleCursor& expansionPosition) : input(_input), hadMacroExpansion(_input.macroExpansion().isValid()) {
|
|
154
|
-
|
|
155
|
-
if(!hadMacroExpansion)
|
|
156
|
-
_input.setMacroExpansion(expansionPosition);
|
|
157
|
-
}
|
|
158
|
-
~EnableMacroExpansion() {
|
|
159
|
-
if(!hadMacroExpansion)
|
|
160
|
-
input.setMacroExpansion(SimpleCursor::invalid());
|
|
161
|
-
}
|
|
162
|
-
Stream& input;
|
|
163
|
-
bool hadMacroExpansion;
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
IndexedString definedIndex = IndexedString("defined");
|
|
167
|
-
IndexedString lineIndex = IndexedString("__LINE__");
|
|
168
|
-
IndexedString fileIndex = IndexedString("__FILE__");
|
|
169
|
-
IndexedString dateIndex = IndexedString("__DATE__");
|
|
170
|
-
IndexedString timeIndex= IndexedString("__TIME__");
|
|
171
|
-
|
|
172
|
-
void pp_macro_expander::operator()(Stream& input, Stream& output)
|
|
173
|
-
{
|
|
174
|
-
skip_blanks(input, output);
|
|
175
|
-
|
|
176
|
-
while (!input.atEnd())
|
|
177
|
-
{
|
|
178
|
-
if (isComment(input))
|
|
179
|
-
{
|
|
180
|
-
skip_comment_or_divop(input, output, true);
|
|
181
|
-
}else{
|
|
182
|
-
if (input == '\n')
|
|
183
|
-
{
|
|
184
|
-
output << input;
|
|
185
|
-
|
|
186
|
-
skip_blanks(++input, output);
|
|
187
|
-
|
|
188
|
-
if (!input.atEnd() && input == '#')
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
else if (input == '#')
|
|
192
|
-
{
|
|
193
|
-
Q_ASSERT(isCharacter(input.current()));
|
|
194
|
-
Q_ASSERT(IndexedString::fromIndex(input.current()).str() == "#");
|
|
195
|
-
|
|
196
|
-
++input;
|
|
197
|
-
|
|
198
|
-
// search for the paste token
|
|
199
|
-
if(input == '#') {
|
|
200
|
-
++input;
|
|
201
|
-
skip_blanks (input, devnull());
|
|
202
|
-
|
|
203
|
-
IndexedString previous = IndexedString::fromIndex(output.popLastOutput()); //Previous already has been expanded
|
|
204
|
-
while(output.offset() > 0 && isCharacter(previous.index()) && characterFromIndex(previous.index()) == ' ')
|
|
205
|
-
previous = IndexedString::fromIndex(output.popLastOutput());
|
|
206
|
-
|
|
207
|
-
IndexedString add = IndexedString::fromIndex(skip_identifier (input));
|
|
208
|
-
|
|
209
|
-
PreprocessedContents newExpanded;
|
|
210
|
-
|
|
211
|
-
{
|
|
212
|
-
//Expand "add", so it is eventually replaced by an actual
|
|
213
|
-
PreprocessedContents actualText;
|
|
214
|
-
actualText.append(add.index());
|
|
215
|
-
|
|
216
|
-
{
|
|
217
|
-
Stream as(&actualText);
|
|
218
|
-
pp_macro_expander expand_actual(m_engine, m_frame);
|
|
219
|
-
Stream nas(&newExpanded);
|
|
220
|
-
expand_actual(as, nas);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
if(!newExpanded.isEmpty()) {
|
|
225
|
-
IndexedString first = IndexedString::fromIndex(newExpanded.first());
|
|
226
|
-
if(!isCharacter(first.index()) || QChar(characterFromIndex(first.index())).isLetterOrNumber() || characterFromIndex(first.index()) == '_') {
|
|
227
|
-
//Merge the tokens
|
|
228
|
-
newExpanded.first() = IndexedString(previous.byteArray() + first.byteArray()).index();
|
|
229
|
-
}else{
|
|
230
|
-
//Cannot merge, prepend the previous text
|
|
231
|
-
newExpanded.prepend(previous.index());
|
|
232
|
-
}
|
|
233
|
-
}else{
|
|
234
|
-
newExpanded.append(previous.index());
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
//Now expand the merged text completely into the output.
|
|
238
|
-
pp_macro_expander final_expansion(m_engine, m_frame);
|
|
239
|
-
Stream nas(&newExpanded, output.currentOutputAnchor());
|
|
240
|
-
final_expansion(nas, output);
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
skip_blanks(input, output);
|
|
245
|
-
|
|
246
|
-
IndexedString identifier = IndexedString::fromIndex( skip_identifier(input) );
|
|
247
|
-
|
|
248
|
-
Anchor inputPosition = input.inputPosition();
|
|
249
|
-
SimpleCursor originalInputPosition = input.originalInputPosition();
|
|
250
|
-
PreprocessedContents formal = resolve_formal(identifier, input).mergeText();
|
|
251
|
-
|
|
252
|
-
//Escape so we don't break on '"'
|
|
253
|
-
for(int a = formal.count()-1; a >= 0; --a) {
|
|
254
|
-
if(formal[a] == indexFromCharacter('\"') || formal[a] == indexFromCharacter('\\'))
|
|
255
|
-
formal.insert(a, indexFromCharacter('\\'));
|
|
256
|
-
else if(formal[a] == indexFromCharacter('\n')) {
|
|
257
|
-
//Replace newlines with "\n"
|
|
258
|
-
formal[a] = indexFromCharacter('n');
|
|
259
|
-
formal.insert(a, indexFromCharacter('\\'));
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
Stream is(&formal, inputPosition);
|
|
265
|
-
is.setOriginalInputPosition(originalInputPosition);
|
|
266
|
-
skip_whitespaces(is, devnull());
|
|
267
|
-
|
|
268
|
-
output << '\"';
|
|
269
|
-
|
|
270
|
-
while (!is.atEnd()) {
|
|
271
|
-
if (is == '"') {
|
|
272
|
-
output << '\\' << is;
|
|
273
|
-
|
|
274
|
-
} else if (is == '\n') {
|
|
275
|
-
output << '"' << is << '"';
|
|
276
|
-
|
|
277
|
-
} else {
|
|
278
|
-
output << is;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
skip_whitespaces(++is, output);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
output << '\"';
|
|
285
|
-
}
|
|
286
|
-
else if (input == '\"')
|
|
287
|
-
{
|
|
288
|
-
check_header_section
|
|
289
|
-
|
|
290
|
-
skip_string_literal(input, output);
|
|
291
|
-
}
|
|
292
|
-
else if (input == '\'')
|
|
293
|
-
{
|
|
294
|
-
check_header_section
|
|
295
|
-
|
|
296
|
-
skip_char_literal(input, output);
|
|
297
|
-
}
|
|
298
|
-
else if (isSpace(input.current()))
|
|
299
|
-
{
|
|
300
|
-
do {
|
|
301
|
-
if (input == '\n' || !isSpace(input.current()))
|
|
302
|
-
break;
|
|
303
|
-
|
|
304
|
-
output << input;
|
|
305
|
-
|
|
306
|
-
} while (!(++input).atEnd());
|
|
307
|
-
}
|
|
308
|
-
else if (isNumber(input.current()))
|
|
309
|
-
{
|
|
310
|
-
check_header_section
|
|
311
|
-
|
|
312
|
-
skip_number (input, output);
|
|
313
|
-
}
|
|
314
|
-
else if (isLetter(input.current()) || input == '_' || !isCharacter(input.current()))
|
|
315
|
-
{
|
|
316
|
-
check_header_section
|
|
317
|
-
|
|
318
|
-
Anchor inputPosition = input.inputPosition();
|
|
319
|
-
IndexedString name = IndexedString::fromIndex(skip_identifier (input));
|
|
320
|
-
|
|
321
|
-
Anchor inputPosition2 = input.inputPosition();
|
|
322
|
-
pp_actual actual = resolve_formal(name, input);
|
|
323
|
-
if (actual.isValid()) {
|
|
324
|
-
Q_ASSERT(actual.text.size() == actual.inputPosition.size());
|
|
325
|
-
|
|
326
|
-
QList<PreprocessedContents>::const_iterator textIt = actual.text.constBegin();
|
|
327
|
-
QList<Anchor>::const_iterator cursorIt = actual.inputPosition.constBegin();
|
|
328
|
-
|
|
329
|
-
for( ; textIt != actual.text.constEnd(); ++textIt, ++cursorIt )
|
|
330
|
-
{
|
|
331
|
-
output.appendString(*cursorIt, *textIt);
|
|
332
|
-
}
|
|
333
|
-
output << ' '; //Insert a whitespace to omit implicit token merging
|
|
334
|
-
output.mark(input.inputPosition());
|
|
335
|
-
|
|
336
|
-
if(actual.text.isEmpty()) {
|
|
337
|
-
int start = input.offset();
|
|
338
|
-
|
|
339
|
-
skip_blanks(input, devnull());
|
|
340
|
-
//Omit paste tokens behind empty used actuals, else we will merge with the previous text
|
|
341
|
-
if(!input.atEnd() && input == '#' && !(++input).atEnd() && input == '#') {
|
|
342
|
-
++input;
|
|
343
|
-
//We have skipped a paste token
|
|
344
|
-
}else{
|
|
345
|
-
input.seek(start);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
continue;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// TODO handle inbuilt "defined" etc functions
|
|
353
|
-
|
|
354
|
-
pp_macro* macro = m_engine->environment()->retrieveMacro(name, false);
|
|
355
|
-
|
|
356
|
-
if (!macro || !macro->defined || macro->hidden || macro->function_like || m_engine->hideNextMacro())
|
|
357
|
-
{
|
|
358
|
-
m_engine->setHideNextMacro(name == definedIndex);
|
|
359
|
-
|
|
360
|
-
if (name == lineIndex)
|
|
361
|
-
output.appendString(inputPosition, convertFromByteArray(QString::number(input.inputPosition().line).toUtf8()));
|
|
362
|
-
else if (name == fileIndex)
|
|
363
|
-
output.appendString(inputPosition, convertFromByteArray(QString("\"%1\"").arg(m_engine->currentFileNameString()).toUtf8()));
|
|
364
|
-
else if (name == dateIndex)
|
|
365
|
-
output.appendString(inputPosition, convertFromByteArray(QDate::currentDate().toString("MMM dd yyyy").toUtf8()));
|
|
366
|
-
else if (name == timeIndex)
|
|
367
|
-
output.appendString(inputPosition, convertFromByteArray(QTime::currentTime().toString("hh:mm:ss").toUtf8()));
|
|
368
|
-
else
|
|
369
|
-
output.appendString(inputPosition, name);
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
EnableMacroExpansion enable(output, input.inputPosition()); //Configure the output-stream so it marks all stored input-positions as transformed through a macro
|
|
374
|
-
|
|
375
|
-
if (macro->definition.size()) {
|
|
376
|
-
macro->hidden = true;
|
|
377
|
-
|
|
378
|
-
pp_macro_expander expand_macro(m_engine);
|
|
379
|
-
///@todo UGLY conversion
|
|
380
|
-
Stream ms((uint*)macro->definition.constData(), macro->definition.size(), Anchor(input.inputPosition(), true));
|
|
381
|
-
ms.setOriginalInputPosition(input.originalInputPosition());
|
|
382
|
-
PreprocessedContents expanded;
|
|
383
|
-
{
|
|
384
|
-
Stream es(&expanded);
|
|
385
|
-
expand_macro(ms, es);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
if (!expanded.isEmpty())
|
|
389
|
-
{
|
|
390
|
-
Stream es(&expanded, Anchor(input.inputPosition(), true));
|
|
391
|
-
es.setOriginalInputPosition(input.originalInputPosition());
|
|
392
|
-
skip_whitespaces(es, devnull());
|
|
393
|
-
IndexedString identifier = IndexedString::fromIndex( skip_identifier(es) );
|
|
394
|
-
|
|
395
|
-
output.appendString(Anchor(input.inputPosition(), true), expanded);
|
|
396
|
-
output << ' '; //Prevent implicit token merging
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
macro->hidden = false;
|
|
400
|
-
}
|
|
401
|
-
}else if(input == '(') {
|
|
402
|
-
|
|
403
|
-
//Eventually execute a function-macro
|
|
404
|
-
|
|
405
|
-
IndexedString previous = IndexedString::fromIndex(indexFromCharacter(' ')); //Previous already has been expanded
|
|
406
|
-
uint stepsBack = 0;
|
|
407
|
-
while(isCharacter(previous.index()) && characterFromIndex(previous.index()) == ' ' && output.peekLastOutput(stepsBack)) {
|
|
408
|
-
previous = IndexedString::fromIndex(output.peekLastOutput(stepsBack));
|
|
409
|
-
++stepsBack;
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
pp_macro* macro = m_engine->environment()->retrieveMacro(previous, false);
|
|
413
|
-
|
|
414
|
-
if(!macro || !macro->function_like || !macro->defined || macro->hidden) {
|
|
415
|
-
output << input;
|
|
416
|
-
++input;
|
|
417
|
-
continue;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
//In case expansion fails, we can skip back to this position
|
|
421
|
-
int openingPosition = input.offset();
|
|
422
|
-
Anchor openingPositionCursor = input.inputPosition();
|
|
423
|
-
|
|
424
|
-
QList<pp_actual> actuals;
|
|
425
|
-
++input; // skip '('
|
|
426
|
-
|
|
427
|
-
RETURN_IF_INPUT_BROKEN
|
|
428
|
-
|
|
429
|
-
pp_macro_expander expand_actual(m_engine, m_frame);
|
|
430
|
-
|
|
431
|
-
{
|
|
432
|
-
PreprocessedContents actualText;
|
|
433
|
-
skip_whitespaces(input, devnull());
|
|
434
|
-
Anchor actualStart = input.inputPosition();
|
|
435
|
-
{
|
|
436
|
-
Stream as(&actualText);
|
|
437
|
-
skip_argument_variadics(actuals, macro, input, as);
|
|
438
|
-
}
|
|
439
|
-
trim(actualText);
|
|
440
|
-
|
|
441
|
-
pp_actual newActual;
|
|
442
|
-
{
|
|
443
|
-
PreprocessedContents newActualText;
|
|
444
|
-
Stream as(&actualText, actualStart);
|
|
445
|
-
as.setOriginalInputPosition(input.originalInputPosition());
|
|
446
|
-
|
|
447
|
-
rpp::LocationTable table;
|
|
448
|
-
table.anchor(0, actualStart, 0);
|
|
449
|
-
Stream nas(&newActualText, actualStart, &table);
|
|
450
|
-
expand_actual(as, nas);
|
|
451
|
-
|
|
452
|
-
table.splitByAnchors(newActualText, actualStart, newActual.text, newActual.inputPosition);
|
|
453
|
-
}
|
|
454
|
-
newActual.forceValid = true;
|
|
455
|
-
|
|
456
|
-
actuals.append(newActual);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
// TODO: why separate from the above?
|
|
460
|
-
while (!input.atEnd() && input == ',')
|
|
461
|
-
{
|
|
462
|
-
++input; // skip ','
|
|
463
|
-
|
|
464
|
-
RETURN_IF_INPUT_BROKEN
|
|
465
|
-
|
|
466
|
-
{
|
|
467
|
-
PreprocessedContents actualText;
|
|
468
|
-
skip_whitespaces(input, devnull());
|
|
469
|
-
Anchor actualStart = input.inputPosition();
|
|
470
|
-
{
|
|
471
|
-
Stream as(&actualText);
|
|
472
|
-
skip_argument_variadics(actuals, macro, input, as);
|
|
473
|
-
}
|
|
474
|
-
trim(actualText);
|
|
475
|
-
|
|
476
|
-
pp_actual newActual;
|
|
477
|
-
{
|
|
478
|
-
PreprocessedContents newActualText;
|
|
479
|
-
Stream as(&actualText, actualStart);
|
|
480
|
-
as.setOriginalInputPosition(input.originalInputPosition());
|
|
481
|
-
|
|
482
|
-
PreprocessedContents actualText;
|
|
483
|
-
rpp::LocationTable table;
|
|
484
|
-
table.anchor(0, actualStart, 0);
|
|
485
|
-
Stream nas(&newActualText, actualStart, &table);
|
|
486
|
-
expand_actual(as, nas);
|
|
487
|
-
|
|
488
|
-
table.splitByAnchors(newActualText, actualStart, newActual.text, newActual.inputPosition);
|
|
489
|
-
}
|
|
490
|
-
newActual.forceValid = true;
|
|
491
|
-
actuals.append(newActual);
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
if( input != ')' ) {
|
|
496
|
-
//Failed to expand the macro. Output the macro name and continue normal
|
|
497
|
-
//processing behind it.(Code completion depends on this behavior when expanding
|
|
498
|
-
//incomplete input-lines)
|
|
499
|
-
input.seek(openingPosition);
|
|
500
|
-
input.setInputPosition(openingPositionCursor);
|
|
501
|
-
//Move one character into the output, so we don't get an endless loop
|
|
502
|
-
output << input;
|
|
503
|
-
++input;
|
|
504
|
-
|
|
505
|
-
continue;
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
//Remove the name of the called macro
|
|
509
|
-
while(stepsBack) {
|
|
510
|
-
--stepsBack;
|
|
511
|
-
output.popLastOutput();
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
//Q_ASSERT(!input.atEnd() && input == ')');
|
|
515
|
-
|
|
516
|
-
++input; // skip ')'
|
|
517
|
-
|
|
518
|
-
#if 0 // ### enable me
|
|
519
|
-
assert ((macro->variadics && macro->formals.size () >= actuals.size ())
|
|
520
|
-
|| macro->formals.size() == actuals.size());
|
|
521
|
-
#endif
|
|
522
|
-
EnableMacroExpansion enable(output, input.inputPosition()); //Configure the output-stream so it marks all stored input-positions as transformed through a macro
|
|
523
|
-
|
|
524
|
-
pp_frame frame(macro, actuals);
|
|
525
|
-
if(m_frame)
|
|
526
|
-
frame.depth = m_frame->depth + 1;
|
|
527
|
-
|
|
528
|
-
if(frame.depth >= maxMacroExpansionDepth)
|
|
529
|
-
{
|
|
530
|
-
qDebug() << "reached maximum macro-expansion depth while expanding" << macro->name.str();
|
|
531
|
-
RETURN_IF_INPUT_BROKEN
|
|
532
|
-
|
|
533
|
-
output << input;
|
|
534
|
-
++input;
|
|
535
|
-
}else{
|
|
536
|
-
pp_macro_expander expand_macro(m_engine, &frame);
|
|
537
|
-
macro->hidden = true;
|
|
538
|
-
///@todo UGLY conversion
|
|
539
|
-
Stream ms((uint*)macro->definition.constData(), macro->definition.size(), Anchor(input.inputPosition(), true));
|
|
540
|
-
ms.setOriginalInputPosition(input.originalInputPosition());
|
|
541
|
-
expand_macro(ms, output);
|
|
542
|
-
output << ' '; //Prevent implicit token merging
|
|
543
|
-
macro->hidden = false;
|
|
544
|
-
}
|
|
545
|
-
} else {
|
|
546
|
-
output << input;
|
|
547
|
-
++input;
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
void pp_macro_expander::skip_argument_variadics (const QList<pp_actual>& __actuals, pp_macro *__macro, Stream& input, Stream& output)
|
|
555
|
-
{
|
|
556
|
-
int first;
|
|
557
|
-
|
|
558
|
-
do {
|
|
559
|
-
first = input.offset();
|
|
560
|
-
skip_argument(input, output);
|
|
561
|
-
|
|
562
|
-
} while ( __macro->variadics
|
|
563
|
-
&& first != input.offset()
|
|
564
|
-
&& !input.atEnd()
|
|
565
|
-
&& input == '.'
|
|
566
|
-
&& (__actuals.size() + 1) == (int)__macro->formals.size());
|
|
567
|
-
}
|
|
568
|
-
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2005 Roberto Raggi <roberto@kdevelop.org>
|
|
3
|
+
Copyright 2006 Hamish Rodda <rodda@kde.org>
|
|
4
|
+
Copyright 2007-2009 David Nolden <david.nolden.kdevelop@art-master.de>
|
|
5
|
+
|
|
6
|
+
Permission to use, copy, modify, distribute, and sell this software and its
|
|
7
|
+
documentation for any purpose is hereby granted without fee, provided that
|
|
8
|
+
the above copyright notice appear in all copies and that both that
|
|
9
|
+
copyright notice and this permission notice appear in supporting
|
|
10
|
+
documentation.
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
KDEVELOP TEAM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
19
|
+
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
#include "pp-macro-expander.h"
|
|
24
|
+
|
|
25
|
+
#include <QDate>
|
|
26
|
+
#include <QTime>
|
|
27
|
+
#include <QtDebug>
|
|
28
|
+
|
|
29
|
+
#include "../problem.h"
|
|
30
|
+
#include "../indexedstring.h"
|
|
31
|
+
|
|
32
|
+
#include "pp-internal.h"
|
|
33
|
+
#include "pp-engine.h"
|
|
34
|
+
#include "pp-environment.h"
|
|
35
|
+
#include "pp-location.h"
|
|
36
|
+
#include "preprocessor.h"
|
|
37
|
+
#include "chartools.h"
|
|
38
|
+
|
|
39
|
+
const int maxMacroExpansionDepth = 50;
|
|
40
|
+
|
|
41
|
+
QString joinIndexVector(const uint* arrays, uint size, QString between) {
|
|
42
|
+
QString ret;
|
|
43
|
+
FOREACH_CUSTOM(uint item, arrays, size) {
|
|
44
|
+
if(!ret.isEmpty())
|
|
45
|
+
ret += between;
|
|
46
|
+
ret += IndexedString::fromIndex(item).str();
|
|
47
|
+
}
|
|
48
|
+
return ret;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
QString joinIndexVector(const QVector<IndexedString>& list, QString between) {
|
|
52
|
+
QString ret;
|
|
53
|
+
foreach(const IndexedString& item, list) {
|
|
54
|
+
if(!ret.isEmpty())
|
|
55
|
+
ret += between;
|
|
56
|
+
ret += item.str();
|
|
57
|
+
}
|
|
58
|
+
return ret;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
void trim(QVector<uint>& array) {
|
|
62
|
+
int lastValid = array.size()-1;
|
|
63
|
+
for(; lastValid >= 0; --lastValid)
|
|
64
|
+
if(array[lastValid] != indexFromCharacter(' '))
|
|
65
|
+
break;
|
|
66
|
+
|
|
67
|
+
array.resize(lastValid+1);
|
|
68
|
+
|
|
69
|
+
int firstValid = 0;
|
|
70
|
+
for(; firstValid < array.size(); ++firstValid)
|
|
71
|
+
if(array[firstValid] != indexFromCharacter(' '))
|
|
72
|
+
break;
|
|
73
|
+
array = array.mid(firstValid);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
using namespace rpp;
|
|
77
|
+
|
|
78
|
+
pp_frame::pp_frame(pp_macro* __expandingMacro, const QList<pp_actual>& __actuals)
|
|
79
|
+
: depth(0)
|
|
80
|
+
, expandingMacro(__expandingMacro)
|
|
81
|
+
, actuals(__actuals)
|
|
82
|
+
{
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
pp_actual pp_macro_expander::resolve_formal(IndexedString name, Stream& input)
|
|
86
|
+
{
|
|
87
|
+
if (!m_frame)
|
|
88
|
+
return pp_actual();
|
|
89
|
+
|
|
90
|
+
Q_ASSERT(m_frame->expandingMacro != 0);
|
|
91
|
+
|
|
92
|
+
const QVector<IndexedString>& formals = m_frame->expandingMacro->formals;
|
|
93
|
+
uint formalsSize = formals.size();
|
|
94
|
+
|
|
95
|
+
if(name.isEmpty()) {
|
|
96
|
+
Problem *problem = new Problem;
|
|
97
|
+
problem->file = m_engine->currentFileNameString();
|
|
98
|
+
problem->position = input.originalInputPosition();
|
|
99
|
+
problem->description = "Macro error";
|
|
100
|
+
m_engine->problemEncountered(problem);
|
|
101
|
+
return pp_actual();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
for (uint index = 0; index < formalsSize; ++index) {
|
|
105
|
+
if (name.index() == formals[index].index()) {
|
|
106
|
+
if (index < (uint)m_frame->actuals.size()) {
|
|
107
|
+
return m_frame->actuals[index];
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
Problem *problem = new Problem;
|
|
111
|
+
problem->file = m_engine->currentFileNameString();
|
|
112
|
+
problem->position = input.originalInputPosition();
|
|
113
|
+
problem->description = QString("Call to macro %1 missing argument number %2").arg(name.str()).arg(index);
|
|
114
|
+
problem->explanation = QString("Formals: %1").arg(joinIndexVector(formals, ", "));
|
|
115
|
+
m_engine->problemEncountered(problem);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return pp_actual();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
#define RETURN_IF_INPUT_BROKEN if(input.atEnd()) { qDebug() << "too early end while expanding" << macro->name.str(); return; }
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
pp_macro_expander::pp_macro_expander(pp* engine, pp_frame* frame, bool inHeaderSection)
|
|
127
|
+
: m_engine(engine)
|
|
128
|
+
, m_frame(frame)
|
|
129
|
+
, m_in_header_section(inHeaderSection)
|
|
130
|
+
, m_search_significant_content(false)
|
|
131
|
+
, m_found_significant_content(false)
|
|
132
|
+
{
|
|
133
|
+
if(m_in_header_section)
|
|
134
|
+
m_search_significant_content = true; //Find the end of the header section
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
//A header-section ends when the first non-directive and non-comment occurs
|
|
138
|
+
#define check_header_section \
|
|
139
|
+
if( m_search_significant_content ) \
|
|
140
|
+
{ \
|
|
141
|
+
\
|
|
142
|
+
if(m_in_header_section) { \
|
|
143
|
+
m_in_header_section = false; \
|
|
144
|
+
m_engine->preprocessor()->headerSectionEnded(input); \
|
|
145
|
+
} \
|
|
146
|
+
m_found_significant_content = true; \
|
|
147
|
+
m_search_significant_content = false; \
|
|
148
|
+
if( input.atEnd() ) \
|
|
149
|
+
continue; \
|
|
150
|
+
} \
|
|
151
|
+
|
|
152
|
+
struct EnableMacroExpansion {
|
|
153
|
+
EnableMacroExpansion(Stream& _input, const SimpleCursor& expansionPosition) : input(_input), hadMacroExpansion(_input.macroExpansion().isValid()) {
|
|
154
|
+
|
|
155
|
+
if(!hadMacroExpansion)
|
|
156
|
+
_input.setMacroExpansion(expansionPosition);
|
|
157
|
+
}
|
|
158
|
+
~EnableMacroExpansion() {
|
|
159
|
+
if(!hadMacroExpansion)
|
|
160
|
+
input.setMacroExpansion(SimpleCursor::invalid());
|
|
161
|
+
}
|
|
162
|
+
Stream& input;
|
|
163
|
+
bool hadMacroExpansion;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
IndexedString definedIndex = IndexedString("defined");
|
|
167
|
+
IndexedString lineIndex = IndexedString("__LINE__");
|
|
168
|
+
IndexedString fileIndex = IndexedString("__FILE__");
|
|
169
|
+
IndexedString dateIndex = IndexedString("__DATE__");
|
|
170
|
+
IndexedString timeIndex= IndexedString("__TIME__");
|
|
171
|
+
|
|
172
|
+
void pp_macro_expander::operator()(Stream& input, Stream& output)
|
|
173
|
+
{
|
|
174
|
+
skip_blanks(input, output);
|
|
175
|
+
|
|
176
|
+
while (!input.atEnd())
|
|
177
|
+
{
|
|
178
|
+
if (isComment(input))
|
|
179
|
+
{
|
|
180
|
+
skip_comment_or_divop(input, output, true);
|
|
181
|
+
}else{
|
|
182
|
+
if (input == '\n')
|
|
183
|
+
{
|
|
184
|
+
output << input;
|
|
185
|
+
|
|
186
|
+
skip_blanks(++input, output);
|
|
187
|
+
|
|
188
|
+
if (!input.atEnd() && input == '#')
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
else if (input == '#')
|
|
192
|
+
{
|
|
193
|
+
Q_ASSERT(isCharacter(input.current()));
|
|
194
|
+
Q_ASSERT(IndexedString::fromIndex(input.current()).str() == "#");
|
|
195
|
+
|
|
196
|
+
++input;
|
|
197
|
+
|
|
198
|
+
// search for the paste token
|
|
199
|
+
if(input == '#') {
|
|
200
|
+
++input;
|
|
201
|
+
skip_blanks (input, devnull());
|
|
202
|
+
|
|
203
|
+
IndexedString previous = IndexedString::fromIndex(output.popLastOutput()); //Previous already has been expanded
|
|
204
|
+
while(output.offset() > 0 && isCharacter(previous.index()) && characterFromIndex(previous.index()) == ' ')
|
|
205
|
+
previous = IndexedString::fromIndex(output.popLastOutput());
|
|
206
|
+
|
|
207
|
+
IndexedString add = IndexedString::fromIndex(skip_identifier (input));
|
|
208
|
+
|
|
209
|
+
PreprocessedContents newExpanded;
|
|
210
|
+
|
|
211
|
+
{
|
|
212
|
+
//Expand "add", so it is eventually replaced by an actual
|
|
213
|
+
PreprocessedContents actualText;
|
|
214
|
+
actualText.append(add.index());
|
|
215
|
+
|
|
216
|
+
{
|
|
217
|
+
Stream as(&actualText);
|
|
218
|
+
pp_macro_expander expand_actual(m_engine, m_frame);
|
|
219
|
+
Stream nas(&newExpanded);
|
|
220
|
+
expand_actual(as, nas);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if(!newExpanded.isEmpty()) {
|
|
225
|
+
IndexedString first = IndexedString::fromIndex(newExpanded.first());
|
|
226
|
+
if(!isCharacter(first.index()) || QChar(characterFromIndex(first.index())).isLetterOrNumber() || characterFromIndex(first.index()) == '_') {
|
|
227
|
+
//Merge the tokens
|
|
228
|
+
newExpanded.first() = IndexedString(previous.byteArray() + first.byteArray()).index();
|
|
229
|
+
}else{
|
|
230
|
+
//Cannot merge, prepend the previous text
|
|
231
|
+
newExpanded.prepend(previous.index());
|
|
232
|
+
}
|
|
233
|
+
}else{
|
|
234
|
+
newExpanded.append(previous.index());
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
//Now expand the merged text completely into the output.
|
|
238
|
+
pp_macro_expander final_expansion(m_engine, m_frame);
|
|
239
|
+
Stream nas(&newExpanded, output.currentOutputAnchor());
|
|
240
|
+
final_expansion(nas, output);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
skip_blanks(input, output);
|
|
245
|
+
|
|
246
|
+
IndexedString identifier = IndexedString::fromIndex( skip_identifier(input) );
|
|
247
|
+
|
|
248
|
+
Anchor inputPosition = input.inputPosition();
|
|
249
|
+
SimpleCursor originalInputPosition = input.originalInputPosition();
|
|
250
|
+
PreprocessedContents formal = resolve_formal(identifier, input).mergeText();
|
|
251
|
+
|
|
252
|
+
//Escape so we don't break on '"'
|
|
253
|
+
for(int a = formal.count()-1; a >= 0; --a) {
|
|
254
|
+
if(formal[a] == indexFromCharacter('\"') || formal[a] == indexFromCharacter('\\'))
|
|
255
|
+
formal.insert(a, indexFromCharacter('\\'));
|
|
256
|
+
else if(formal[a] == indexFromCharacter('\n')) {
|
|
257
|
+
//Replace newlines with "\n"
|
|
258
|
+
formal[a] = indexFromCharacter('n');
|
|
259
|
+
formal.insert(a, indexFromCharacter('\\'));
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
Stream is(&formal, inputPosition);
|
|
265
|
+
is.setOriginalInputPosition(originalInputPosition);
|
|
266
|
+
skip_whitespaces(is, devnull());
|
|
267
|
+
|
|
268
|
+
output << '\"';
|
|
269
|
+
|
|
270
|
+
while (!is.atEnd()) {
|
|
271
|
+
if (is == '"') {
|
|
272
|
+
output << '\\' << is;
|
|
273
|
+
|
|
274
|
+
} else if (is == '\n') {
|
|
275
|
+
output << '"' << is << '"';
|
|
276
|
+
|
|
277
|
+
} else {
|
|
278
|
+
output << is;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
skip_whitespaces(++is, output);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
output << '\"';
|
|
285
|
+
}
|
|
286
|
+
else if (input == '\"')
|
|
287
|
+
{
|
|
288
|
+
check_header_section
|
|
289
|
+
|
|
290
|
+
skip_string_literal(input, output);
|
|
291
|
+
}
|
|
292
|
+
else if (input == '\'')
|
|
293
|
+
{
|
|
294
|
+
check_header_section
|
|
295
|
+
|
|
296
|
+
skip_char_literal(input, output);
|
|
297
|
+
}
|
|
298
|
+
else if (isSpace(input.current()))
|
|
299
|
+
{
|
|
300
|
+
do {
|
|
301
|
+
if (input == '\n' || !isSpace(input.current()))
|
|
302
|
+
break;
|
|
303
|
+
|
|
304
|
+
output << input;
|
|
305
|
+
|
|
306
|
+
} while (!(++input).atEnd());
|
|
307
|
+
}
|
|
308
|
+
else if (isNumber(input.current()))
|
|
309
|
+
{
|
|
310
|
+
check_header_section
|
|
311
|
+
|
|
312
|
+
skip_number (input, output);
|
|
313
|
+
}
|
|
314
|
+
else if (isLetter(input.current()) || input == '_' || !isCharacter(input.current()))
|
|
315
|
+
{
|
|
316
|
+
check_header_section
|
|
317
|
+
|
|
318
|
+
Anchor inputPosition = input.inputPosition();
|
|
319
|
+
IndexedString name = IndexedString::fromIndex(skip_identifier (input));
|
|
320
|
+
|
|
321
|
+
Anchor inputPosition2 = input.inputPosition();
|
|
322
|
+
pp_actual actual = resolve_formal(name, input);
|
|
323
|
+
if (actual.isValid()) {
|
|
324
|
+
Q_ASSERT(actual.text.size() == actual.inputPosition.size());
|
|
325
|
+
|
|
326
|
+
QList<PreprocessedContents>::const_iterator textIt = actual.text.constBegin();
|
|
327
|
+
QList<Anchor>::const_iterator cursorIt = actual.inputPosition.constBegin();
|
|
328
|
+
|
|
329
|
+
for( ; textIt != actual.text.constEnd(); ++textIt, ++cursorIt )
|
|
330
|
+
{
|
|
331
|
+
output.appendString(*cursorIt, *textIt);
|
|
332
|
+
}
|
|
333
|
+
output << ' '; //Insert a whitespace to omit implicit token merging
|
|
334
|
+
output.mark(input.inputPosition());
|
|
335
|
+
|
|
336
|
+
if(actual.text.isEmpty()) {
|
|
337
|
+
int start = input.offset();
|
|
338
|
+
|
|
339
|
+
skip_blanks(input, devnull());
|
|
340
|
+
//Omit paste tokens behind empty used actuals, else we will merge with the previous text
|
|
341
|
+
if(!input.atEnd() && input == '#' && !(++input).atEnd() && input == '#') {
|
|
342
|
+
++input;
|
|
343
|
+
//We have skipped a paste token
|
|
344
|
+
}else{
|
|
345
|
+
input.seek(start);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// TODO handle inbuilt "defined" etc functions
|
|
353
|
+
|
|
354
|
+
pp_macro* macro = m_engine->environment()->retrieveMacro(name, false);
|
|
355
|
+
|
|
356
|
+
if (!macro || !macro->defined || macro->hidden || macro->function_like || m_engine->hideNextMacro())
|
|
357
|
+
{
|
|
358
|
+
m_engine->setHideNextMacro(name == definedIndex);
|
|
359
|
+
|
|
360
|
+
if (name == lineIndex)
|
|
361
|
+
output.appendString(inputPosition, convertFromByteArray(QString::number(input.inputPosition().line).toUtf8()));
|
|
362
|
+
else if (name == fileIndex)
|
|
363
|
+
output.appendString(inputPosition, convertFromByteArray(QString("\"%1\"").arg(m_engine->currentFileNameString()).toUtf8()));
|
|
364
|
+
else if (name == dateIndex)
|
|
365
|
+
output.appendString(inputPosition, convertFromByteArray(QDate::currentDate().toString("MMM dd yyyy").toUtf8()));
|
|
366
|
+
else if (name == timeIndex)
|
|
367
|
+
output.appendString(inputPosition, convertFromByteArray(QTime::currentTime().toString("hh:mm:ss").toUtf8()));
|
|
368
|
+
else
|
|
369
|
+
output.appendString(inputPosition, name);
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
EnableMacroExpansion enable(output, input.inputPosition()); //Configure the output-stream so it marks all stored input-positions as transformed through a macro
|
|
374
|
+
|
|
375
|
+
if (macro->definition.size()) {
|
|
376
|
+
macro->hidden = true;
|
|
377
|
+
|
|
378
|
+
pp_macro_expander expand_macro(m_engine);
|
|
379
|
+
///@todo UGLY conversion
|
|
380
|
+
Stream ms((uint*)macro->definition.constData(), macro->definition.size(), Anchor(input.inputPosition(), true));
|
|
381
|
+
ms.setOriginalInputPosition(input.originalInputPosition());
|
|
382
|
+
PreprocessedContents expanded;
|
|
383
|
+
{
|
|
384
|
+
Stream es(&expanded);
|
|
385
|
+
expand_macro(ms, es);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
if (!expanded.isEmpty())
|
|
389
|
+
{
|
|
390
|
+
Stream es(&expanded, Anchor(input.inputPosition(), true));
|
|
391
|
+
es.setOriginalInputPosition(input.originalInputPosition());
|
|
392
|
+
skip_whitespaces(es, devnull());
|
|
393
|
+
IndexedString identifier = IndexedString::fromIndex( skip_identifier(es) );
|
|
394
|
+
|
|
395
|
+
output.appendString(Anchor(input.inputPosition(), true), expanded);
|
|
396
|
+
output << ' '; //Prevent implicit token merging
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
macro->hidden = false;
|
|
400
|
+
}
|
|
401
|
+
}else if(input == '(') {
|
|
402
|
+
|
|
403
|
+
//Eventually execute a function-macro
|
|
404
|
+
|
|
405
|
+
IndexedString previous = IndexedString::fromIndex(indexFromCharacter(' ')); //Previous already has been expanded
|
|
406
|
+
uint stepsBack = 0;
|
|
407
|
+
while(isCharacter(previous.index()) && characterFromIndex(previous.index()) == ' ' && output.peekLastOutput(stepsBack)) {
|
|
408
|
+
previous = IndexedString::fromIndex(output.peekLastOutput(stepsBack));
|
|
409
|
+
++stepsBack;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
pp_macro* macro = m_engine->environment()->retrieveMacro(previous, false);
|
|
413
|
+
|
|
414
|
+
if(!macro || !macro->function_like || !macro->defined || macro->hidden) {
|
|
415
|
+
output << input;
|
|
416
|
+
++input;
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
//In case expansion fails, we can skip back to this position
|
|
421
|
+
int openingPosition = input.offset();
|
|
422
|
+
Anchor openingPositionCursor = input.inputPosition();
|
|
423
|
+
|
|
424
|
+
QList<pp_actual> actuals;
|
|
425
|
+
++input; // skip '('
|
|
426
|
+
|
|
427
|
+
RETURN_IF_INPUT_BROKEN
|
|
428
|
+
|
|
429
|
+
pp_macro_expander expand_actual(m_engine, m_frame);
|
|
430
|
+
|
|
431
|
+
{
|
|
432
|
+
PreprocessedContents actualText;
|
|
433
|
+
skip_whitespaces(input, devnull());
|
|
434
|
+
Anchor actualStart = input.inputPosition();
|
|
435
|
+
{
|
|
436
|
+
Stream as(&actualText);
|
|
437
|
+
skip_argument_variadics(actuals, macro, input, as);
|
|
438
|
+
}
|
|
439
|
+
trim(actualText);
|
|
440
|
+
|
|
441
|
+
pp_actual newActual;
|
|
442
|
+
{
|
|
443
|
+
PreprocessedContents newActualText;
|
|
444
|
+
Stream as(&actualText, actualStart);
|
|
445
|
+
as.setOriginalInputPosition(input.originalInputPosition());
|
|
446
|
+
|
|
447
|
+
rpp::LocationTable table;
|
|
448
|
+
table.anchor(0, actualStart, 0);
|
|
449
|
+
Stream nas(&newActualText, actualStart, &table);
|
|
450
|
+
expand_actual(as, nas);
|
|
451
|
+
|
|
452
|
+
table.splitByAnchors(newActualText, actualStart, newActual.text, newActual.inputPosition);
|
|
453
|
+
}
|
|
454
|
+
newActual.forceValid = true;
|
|
455
|
+
|
|
456
|
+
actuals.append(newActual);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// TODO: why separate from the above?
|
|
460
|
+
while (!input.atEnd() && input == ',')
|
|
461
|
+
{
|
|
462
|
+
++input; // skip ','
|
|
463
|
+
|
|
464
|
+
RETURN_IF_INPUT_BROKEN
|
|
465
|
+
|
|
466
|
+
{
|
|
467
|
+
PreprocessedContents actualText;
|
|
468
|
+
skip_whitespaces(input, devnull());
|
|
469
|
+
Anchor actualStart = input.inputPosition();
|
|
470
|
+
{
|
|
471
|
+
Stream as(&actualText);
|
|
472
|
+
skip_argument_variadics(actuals, macro, input, as);
|
|
473
|
+
}
|
|
474
|
+
trim(actualText);
|
|
475
|
+
|
|
476
|
+
pp_actual newActual;
|
|
477
|
+
{
|
|
478
|
+
PreprocessedContents newActualText;
|
|
479
|
+
Stream as(&actualText, actualStart);
|
|
480
|
+
as.setOriginalInputPosition(input.originalInputPosition());
|
|
481
|
+
|
|
482
|
+
PreprocessedContents actualText;
|
|
483
|
+
rpp::LocationTable table;
|
|
484
|
+
table.anchor(0, actualStart, 0);
|
|
485
|
+
Stream nas(&newActualText, actualStart, &table);
|
|
486
|
+
expand_actual(as, nas);
|
|
487
|
+
|
|
488
|
+
table.splitByAnchors(newActualText, actualStart, newActual.text, newActual.inputPosition);
|
|
489
|
+
}
|
|
490
|
+
newActual.forceValid = true;
|
|
491
|
+
actuals.append(newActual);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
if( input != ')' ) {
|
|
496
|
+
//Failed to expand the macro. Output the macro name and continue normal
|
|
497
|
+
//processing behind it.(Code completion depends on this behavior when expanding
|
|
498
|
+
//incomplete input-lines)
|
|
499
|
+
input.seek(openingPosition);
|
|
500
|
+
input.setInputPosition(openingPositionCursor);
|
|
501
|
+
//Move one character into the output, so we don't get an endless loop
|
|
502
|
+
output << input;
|
|
503
|
+
++input;
|
|
504
|
+
|
|
505
|
+
continue;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
//Remove the name of the called macro
|
|
509
|
+
while(stepsBack) {
|
|
510
|
+
--stepsBack;
|
|
511
|
+
output.popLastOutput();
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
//Q_ASSERT(!input.atEnd() && input == ')');
|
|
515
|
+
|
|
516
|
+
++input; // skip ')'
|
|
517
|
+
|
|
518
|
+
#if 0 // ### enable me
|
|
519
|
+
assert ((macro->variadics && macro->formals.size () >= actuals.size ())
|
|
520
|
+
|| macro->formals.size() == actuals.size());
|
|
521
|
+
#endif
|
|
522
|
+
EnableMacroExpansion enable(output, input.inputPosition()); //Configure the output-stream so it marks all stored input-positions as transformed through a macro
|
|
523
|
+
|
|
524
|
+
pp_frame frame(macro, actuals);
|
|
525
|
+
if(m_frame)
|
|
526
|
+
frame.depth = m_frame->depth + 1;
|
|
527
|
+
|
|
528
|
+
if(frame.depth >= maxMacroExpansionDepth)
|
|
529
|
+
{
|
|
530
|
+
qDebug() << "reached maximum macro-expansion depth while expanding" << macro->name.str();
|
|
531
|
+
RETURN_IF_INPUT_BROKEN
|
|
532
|
+
|
|
533
|
+
output << input;
|
|
534
|
+
++input;
|
|
535
|
+
}else{
|
|
536
|
+
pp_macro_expander expand_macro(m_engine, &frame);
|
|
537
|
+
macro->hidden = true;
|
|
538
|
+
///@todo UGLY conversion
|
|
539
|
+
Stream ms((uint*)macro->definition.constData(), macro->definition.size(), Anchor(input.inputPosition(), true));
|
|
540
|
+
ms.setOriginalInputPosition(input.originalInputPosition());
|
|
541
|
+
expand_macro(ms, output);
|
|
542
|
+
output << ' '; //Prevent implicit token merging
|
|
543
|
+
macro->hidden = false;
|
|
544
|
+
}
|
|
545
|
+
} else {
|
|
546
|
+
output << input;
|
|
547
|
+
++input;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
void pp_macro_expander::skip_argument_variadics (const QList<pp_actual>& __actuals, pp_macro *__macro, Stream& input, Stream& output)
|
|
555
|
+
{
|
|
556
|
+
int first;
|
|
557
|
+
|
|
558
|
+
do {
|
|
559
|
+
first = input.offset();
|
|
560
|
+
skip_argument(input, output);
|
|
561
|
+
|
|
562
|
+
} while ( __macro->variadics
|
|
563
|
+
&& first != input.offset()
|
|
564
|
+
&& !input.atEnd()
|
|
565
|
+
&& input == '.'
|
|
566
|
+
&& (__actuals.size() + 1) == (int)__macro->formals.size());
|
|
567
|
+
}
|
|
568
|
+
|