From ec3452679c00266166e2f542bb3b58df85a0a4f8 Mon Sep 17 00:00:00 2001 From: Ykkrosh Date: Sun, 5 Dec 2004 17:59:29 +0000 Subject: [PATCH] Restructuring This was SVN commit r1453. --- build/bin/perl58.dll | Bin 0 -> 370176 bytes build/errorlist/errorlist.exe | Bin 0 -> 149504 bytes build/errorlist/errorlist.pl | 197 +++ build/linefix/linefix.exe | Bin 0 -> 135168 bytes build/premake/functions.lua | 7 + .../workspaces => build}/premake/premake.exe | Bin .../workspaces => build}/premake/premake.lua | 90 +- build/premake/src/CHANGES.txt | 103 ++ build/premake/src/LICENSE.txt | 340 +++++ build/premake/src/Makefile | 24 + build/premake/src/Premake.dsp | 325 +++++ build/premake/src/Premake.dsw | 29 + build/premake/src/Premake.make | 112 ++ build/premake/src/Premake.sln | 21 + build/premake/src/Premake.vcproj | 314 +++++ build/premake/src/README.txt | 20 + build/premake/src/Src/Lua/COPYRIGHT | 54 + build/premake/src/Src/Lua/README | 72 ++ build/premake/src/Src/Lua/lapi.c | 494 ++++++++ build/premake/src/Src/Lua/lapi.h | 17 + build/premake/src/Src/Lua/lauxlib.c | 216 ++++ build/premake/src/Src/Lua/lauxlib.h | 100 ++ build/premake/src/Src/Lua/lbaselib.c | 651 ++++++++++ build/premake/src/Src/Lua/lcode.c | 701 ++++++++++ build/premake/src/Src/Lua/lcode.h | 70 + build/premake/src/Src/Lua/ldebug.c | 466 +++++++ build/premake/src/Src/Lua/ldebug.h | 21 + build/premake/src/Src/Lua/ldo.c | 388 ++++++ build/premake/src/Src/Lua/ldo.h | 33 + build/premake/src/Src/Lua/lfunc.c | 109 ++ build/premake/src/Src/Lua/lfunc.h | 24 + build/premake/src/Src/Lua/lgc.c | 353 ++++++ build/premake/src/Src/Lua/lgc.h | 19 + build/premake/src/Src/Lua/liolib.c | 718 +++++++++++ build/premake/src/Src/Lua/llex.c | 380 ++++++ build/premake/src/Src/Lua/llex.h | 72 ++ build/premake/src/Src/Lua/llimits.h | 204 +++ build/premake/src/Src/Lua/lmathlib.c | 238 ++++ build/premake/src/Src/Lua/lmem.c | 150 +++ build/premake/src/Src/Lua/lmem.h | 42 + build/premake/src/Src/Lua/lobject.c | 125 ++ build/premake/src/Src/Lua/lobject.h | 204 +++ build/premake/src/Src/Lua/lopcodes.h | 168 +++ build/premake/src/Src/Lua/lparser.c | 1124 +++++++++++++++++ build/premake/src/Src/Lua/lparser.h | 60 + build/premake/src/Src/Lua/lstate.c | 121 ++ build/premake/src/Src/Lua/lstate.h | 77 ++ build/premake/src/Src/Lua/lstring.c | 155 +++ build/premake/src/Src/Lua/lstring.h | 37 + build/premake/src/Src/Lua/lstrlib.c | 621 +++++++++ build/premake/src/Src/Lua/ltable.c | 303 +++++ build/premake/src/Src/Lua/ltable.h | 34 + build/premake/src/Src/Lua/ltests.c | 543 ++++++++ build/premake/src/Src/Lua/ltm.c | 163 +++ build/premake/src/Src/Lua/ltm.h | 59 + build/premake/src/Src/Lua/lua.h | 248 ++++ build/premake/src/Src/Lua/luadebug.h | 46 + build/premake/src/Src/Lua/lualib.h | 34 + build/premake/src/Src/Lua/lundump.c | 244 ++++ build/premake/src/Src/Lua/lundump.h | 35 + build/premake/src/Src/Lua/lvm.c | 710 +++++++++++ build/premake/src/Src/Lua/lvm.h | 32 + build/premake/src/Src/Lua/lzio.c | 84 ++ build/premake/src/Src/Lua/lzio.h | 53 + build/premake/src/Src/clean.c | 74 ++ build/premake/src/Src/gnu.c | 568 +++++++++ build/premake/src/Src/posix.c | 179 +++ build/premake/src/Src/premake.c | 218 ++++ build/premake/src/Src/project.c | 898 +++++++++++++ build/premake/src/Src/project.h | 81 ++ build/premake/src/Src/sharpdev.c | 356 ++++++ build/premake/src/Src/util.c | 566 +++++++++ build/premake/src/Src/util.h | 51 + build/premake/src/Src/vs6.c | 614 +++++++++ build/premake/src/Src/vs7.c | 897 +++++++++++++ build/premake/src/Src/windows.c | 169 +++ build/premake/src/premake.lua | 30 + .../workspaces/required-libraries-linux.txt | 0 .../workspaces/required-libraries.txt | 0 .../workspaces/update-workspaces.bat | 0 .../workspaces/update-workspaces.sh | 0 source/{ => tools}/ape/ape.dsp | 0 source/{ => tools}/ape/ape.dsw | 0 source/{ => tools}/ape/ext/MathUtil.h | 0 source/{ => tools}/ape/ext/Particle.cpp | 0 source/{ => tools}/ape/ext/Particle.h | 0 .../{ => tools}/ape/ext/ParticleEmitter.cpp | 0 source/{ => tools}/ape/ext/ParticleEmitter.h | 0 source/{ => tools}/ape/ext/ParticleSystem.cpp | 0 source/{ => tools}/ape/ext/ParticleSystem.h | 0 source/{ => tools}/ape/ext/Sprite.cpp | 0 source/{ => tools}/ape/ext/Sprite.h | 0 source/{ => tools}/ape/ext/Types.h | 0 source/{ => tools}/ape/ext/Vector3D.cpp | 0 source/{ => tools}/ape/ext/Vector3D.h | 0 source/{ => tools}/ape/ext/tex_.cpp | 0 source/{ => tools}/ape/ext/tex_.h | 0 source/{ => tools}/ape/ext/timer_.cpp | 0 source/{ => tools}/ape/ext/timer_.h | 0 source/{ => tools}/ape/main.cpp | 0 source/{ => tools}/ape/readme.txt | 0 .../sced/AlterElevationCommand.cpp | 0 .../{ => tools}/sced/AlterElevationCommand.h | 0 .../{ => tools}/sced/AlterLightEnvCommand.cpp | 0 .../{ => tools}/sced/AlterLightEnvCommand.h | 0 source/{ => tools}/sced/Array2D.h | 0 .../{ => tools}/sced/BrushShapeEditorTool.cpp | 0 .../{ => tools}/sced/BrushShapeEditorTool.h | 0 source/{ => tools}/sced/BrushTool.cpp | 0 source/{ => tools}/sced/BrushTool.h | 0 source/{ => tools}/sced/Command.h | 0 source/{ => tools}/sced/CommandManager.cpp | 0 source/{ => tools}/sced/CommandManager.h | 0 source/{ => tools}/sced/EditorData.cpp | 0 source/{ => tools}/sced/EditorData.h | 0 source/{ => tools}/sced/InfoBox.cpp | 0 source/{ => tools}/sced/InfoBox.h | 0 source/{ => tools}/sced/MiniMap.cpp | 0 source/{ => tools}/sced/MiniMap.h | 0 source/{ => tools}/sced/NaviCam.cpp | 0 source/{ => tools}/sced/NaviCam.h | 0 .../{ => tools}/sced/PaintObjectCommand.cpp | 0 source/{ => tools}/sced/PaintObjectCommand.h | 0 source/{ => tools}/sced/PaintObjectTool.cpp | 0 source/{ => tools}/sced/PaintObjectTool.h | 0 .../{ => tools}/sced/PaintTextureCommand.cpp | 0 source/{ => tools}/sced/PaintTextureCommand.h | 0 source/{ => tools}/sced/PaintTextureTool.cpp | 0 source/{ => tools}/sced/PaintTextureTool.h | 0 .../sced/RaiseElevationCommand.cpp | 0 .../{ => tools}/sced/RaiseElevationCommand.h | 0 .../{ => tools}/sced/RaiseElevationTool.cpp | 0 source/{ => tools}/sced/RaiseElevationTool.h | 0 source/{ => tools}/sced/ScEd.clw | 0 source/{ => tools}/sced/ScEd.dep | 0 source/{ => tools}/sced/ScEd.dsp | 0 source/{ => tools}/sced/ScEd.mak | 0 source/{ => tools}/sced/SelectObjectTool.cpp | 0 source/{ => tools}/sced/SelectObjectTool.h | 0 .../sced/SmoothElevationCommand.cpp | 0 .../{ => tools}/sced/SmoothElevationCommand.h | 0 .../{ => tools}/sced/SmoothElevationTool.cpp | 0 source/{ => tools}/sced/SmoothElevationTool.h | 0 source/{ => tools}/sced/Tool.h | 0 source/{ => tools}/sced/ToolManager.cpp | 0 source/{ => tools}/sced/ToolManager.h | 0 source/{ => tools}/sced/UserConfig.cpp | 0 source/{ => tools}/sced/UserConfig.h | 0 .../sced/ui/BrushShapeEditorDlgBar.cpp | 0 .../sced/ui/BrushShapeEditorDlgBar.h | 0 source/{ => tools}/sced/ui/ColorButton.cpp | 0 source/{ => tools}/sced/ui/ColorButton.h | 0 .../{ => tools}/sced/ui/DirectionButton.cpp | 0 source/{ => tools}/sced/ui/DirectionButton.h | 0 .../{ => tools}/sced/ui/ElevToolsDlgBar.cpp | 0 source/{ => tools}/sced/ui/ElevToolsDlgBar.h | 0 .../{ => tools}/sced/ui/ElevationButton.cpp | 0 source/{ => tools}/sced/ui/ElevationButton.h | 0 source/{ => tools}/sced/ui/ImageListCtrl.cpp | 0 source/{ => tools}/sced/ui/ImageListCtrl.h | 0 .../{ => tools}/sced/ui/LightSettingsDlg.cpp | 0 source/{ => tools}/sced/ui/LightSettingsDlg.h | 0 .../{ => tools}/sced/ui/MainFrameDlgBar.cpp | 0 source/{ => tools}/sced/ui/MainFrameDlgBar.h | 0 source/{ => tools}/sced/ui/MainFrm.cpp | 0 source/{ => tools}/sced/ui/MainFrm.h | 0 source/{ => tools}/sced/ui/MapSizeDlg.cpp | 0 source/{ => tools}/sced/ui/MapSizeDlg.h | 0 .../{ => tools}/sced/ui/NavigatePropPage.cpp | 0 source/{ => tools}/sced/ui/NavigatePropPage.h | 0 source/{ => tools}/sced/ui/OptionsDlg.cpp | 0 source/{ => tools}/sced/ui/OptionsDlg.h | 0 .../{ => tools}/sced/ui/OptionsPropSheet.cpp | 0 source/{ => tools}/sced/ui/OptionsPropSheet.h | 0 source/{ => tools}/sced/ui/ScEd.cpp | 0 source/{ => tools}/sced/ui/ScEd.h | 0 source/{ => tools}/sced/ui/ScEd.rc | 0 source/{ => tools}/sced/ui/ScEdDoc.cpp | 0 source/{ => tools}/sced/ui/ScEdDoc.h | 0 source/{ => tools}/sced/ui/ScEdView.cpp | 0 source/{ => tools}/sced/ui/ScEdView.h | 0 .../{ => tools}/sced/ui/ShadowsPropPage.cpp | 0 source/{ => tools}/sced/ui/ShadowsPropPage.h | 0 source/{ => tools}/sced/ui/SimpleEdit.cpp | 0 source/{ => tools}/sced/ui/SimpleEdit.h | 0 source/{ => tools}/sced/ui/StdAfx.h | 0 source/{ => tools}/sced/ui/TexToolsDlgBar.cpp | 0 source/{ => tools}/sced/ui/TexToolsDlgBar.h | 0 source/{ => tools}/sced/ui/UIGlobals.cpp | 0 source/{ => tools}/sced/ui/UIGlobals.h | 0 .../sced/ui/UnitPropertiesAnimationsTab.cpp | 0 .../sced/ui/UnitPropertiesAnimationsTab.h | 0 .../sced/ui/UnitPropertiesDlgBar.cpp | 0 .../sced/ui/UnitPropertiesDlgBar.h | 0 .../sced/ui/UnitPropertiesTabCtrl.cpp | 0 .../sced/ui/UnitPropertiesTabCtrl.h | 0 .../sced/ui/UnitPropertiesTexturesTab.cpp | 0 .../sced/ui/UnitPropertiesTexturesTab.h | 0 .../{ => tools}/sced/ui/UnitToolsDlgBar.cpp | 0 source/{ => tools}/sced/ui/UnitToolsDlgBar.h | 0 source/{ => tools}/sced/ui/WebLinkButton.cpp | 0 source/{ => tools}/sced/ui/WebLinkButton.h | 0 source/{ => tools}/sced/ui/resource.h | 0 source/workspaces/premake/functions.lua | 7 - 204 files changed, 17116 insertions(+), 46 deletions(-) create mode 100644 build/bin/perl58.dll create mode 100644 build/errorlist/errorlist.exe create mode 100644 build/errorlist/errorlist.pl create mode 100644 build/linefix/linefix.exe create mode 100755 build/premake/functions.lua rename {source/workspaces => build}/premake/premake.exe (100%) rename {source/workspaces => build}/premake/premake.lua (71%) create mode 100644 build/premake/src/CHANGES.txt create mode 100644 build/premake/src/LICENSE.txt create mode 100644 build/premake/src/Makefile create mode 100644 build/premake/src/Premake.dsp create mode 100644 build/premake/src/Premake.dsw create mode 100644 build/premake/src/Premake.make create mode 100644 build/premake/src/Premake.sln create mode 100644 build/premake/src/Premake.vcproj create mode 100644 build/premake/src/README.txt create mode 100644 build/premake/src/Src/Lua/COPYRIGHT create mode 100644 build/premake/src/Src/Lua/README create mode 100644 build/premake/src/Src/Lua/lapi.c create mode 100644 build/premake/src/Src/Lua/lapi.h create mode 100644 build/premake/src/Src/Lua/lauxlib.c create mode 100644 build/premake/src/Src/Lua/lauxlib.h create mode 100644 build/premake/src/Src/Lua/lbaselib.c create mode 100644 build/premake/src/Src/Lua/lcode.c create mode 100644 build/premake/src/Src/Lua/lcode.h create mode 100644 build/premake/src/Src/Lua/ldebug.c create mode 100644 build/premake/src/Src/Lua/ldebug.h create mode 100644 build/premake/src/Src/Lua/ldo.c create mode 100644 build/premake/src/Src/Lua/ldo.h create mode 100644 build/premake/src/Src/Lua/lfunc.c create mode 100644 build/premake/src/Src/Lua/lfunc.h create mode 100644 build/premake/src/Src/Lua/lgc.c create mode 100644 build/premake/src/Src/Lua/lgc.h create mode 100644 build/premake/src/Src/Lua/liolib.c create mode 100644 build/premake/src/Src/Lua/llex.c create mode 100644 build/premake/src/Src/Lua/llex.h create mode 100644 build/premake/src/Src/Lua/llimits.h create mode 100644 build/premake/src/Src/Lua/lmathlib.c create mode 100644 build/premake/src/Src/Lua/lmem.c create mode 100644 build/premake/src/Src/Lua/lmem.h create mode 100644 build/premake/src/Src/Lua/lobject.c create mode 100644 build/premake/src/Src/Lua/lobject.h create mode 100644 build/premake/src/Src/Lua/lopcodes.h create mode 100644 build/premake/src/Src/Lua/lparser.c create mode 100644 build/premake/src/Src/Lua/lparser.h create mode 100644 build/premake/src/Src/Lua/lstate.c create mode 100644 build/premake/src/Src/Lua/lstate.h create mode 100644 build/premake/src/Src/Lua/lstring.c create mode 100644 build/premake/src/Src/Lua/lstring.h create mode 100644 build/premake/src/Src/Lua/lstrlib.c create mode 100644 build/premake/src/Src/Lua/ltable.c create mode 100644 build/premake/src/Src/Lua/ltable.h create mode 100644 build/premake/src/Src/Lua/ltests.c create mode 100644 build/premake/src/Src/Lua/ltm.c create mode 100644 build/premake/src/Src/Lua/ltm.h create mode 100644 build/premake/src/Src/Lua/lua.h create mode 100644 build/premake/src/Src/Lua/luadebug.h create mode 100644 build/premake/src/Src/Lua/lualib.h create mode 100644 build/premake/src/Src/Lua/lundump.c create mode 100644 build/premake/src/Src/Lua/lundump.h create mode 100644 build/premake/src/Src/Lua/lvm.c create mode 100644 build/premake/src/Src/Lua/lvm.h create mode 100644 build/premake/src/Src/Lua/lzio.c create mode 100644 build/premake/src/Src/Lua/lzio.h create mode 100644 build/premake/src/Src/clean.c create mode 100644 build/premake/src/Src/gnu.c create mode 100644 build/premake/src/Src/posix.c create mode 100644 build/premake/src/Src/premake.c create mode 100644 build/premake/src/Src/project.c create mode 100644 build/premake/src/Src/project.h create mode 100644 build/premake/src/Src/sharpdev.c create mode 100644 build/premake/src/Src/util.c create mode 100644 build/premake/src/Src/util.h create mode 100644 build/premake/src/Src/vs6.c create mode 100644 build/premake/src/Src/vs7.c create mode 100644 build/premake/src/Src/windows.c create mode 100644 build/premake/src/premake.lua rename {source => build}/workspaces/required-libraries-linux.txt (100%) rename {source => build}/workspaces/required-libraries.txt (100%) rename {source => build}/workspaces/update-workspaces.bat (100%) rename {source => build}/workspaces/update-workspaces.sh (100%) rename source/{ => tools}/ape/ape.dsp (100%) rename source/{ => tools}/ape/ape.dsw (100%) rename source/{ => tools}/ape/ext/MathUtil.h (100%) rename source/{ => tools}/ape/ext/Particle.cpp (100%) rename source/{ => tools}/ape/ext/Particle.h (100%) rename source/{ => tools}/ape/ext/ParticleEmitter.cpp (100%) rename source/{ => tools}/ape/ext/ParticleEmitter.h (100%) rename source/{ => tools}/ape/ext/ParticleSystem.cpp (100%) rename source/{ => tools}/ape/ext/ParticleSystem.h (100%) rename source/{ => tools}/ape/ext/Sprite.cpp (100%) rename source/{ => tools}/ape/ext/Sprite.h (100%) rename source/{ => tools}/ape/ext/Types.h (100%) rename source/{ => tools}/ape/ext/Vector3D.cpp (100%) rename source/{ => tools}/ape/ext/Vector3D.h (100%) rename source/{ => tools}/ape/ext/tex_.cpp (100%) rename source/{ => tools}/ape/ext/tex_.h (100%) rename source/{ => tools}/ape/ext/timer_.cpp (100%) rename source/{ => tools}/ape/ext/timer_.h (100%) rename source/{ => tools}/ape/main.cpp (100%) rename source/{ => tools}/ape/readme.txt (100%) rename source/{ => tools}/sced/AlterElevationCommand.cpp (100%) rename source/{ => tools}/sced/AlterElevationCommand.h (100%) rename source/{ => tools}/sced/AlterLightEnvCommand.cpp (100%) rename source/{ => tools}/sced/AlterLightEnvCommand.h (100%) rename source/{ => tools}/sced/Array2D.h (100%) rename source/{ => tools}/sced/BrushShapeEditorTool.cpp (100%) rename source/{ => tools}/sced/BrushShapeEditorTool.h (100%) rename source/{ => tools}/sced/BrushTool.cpp (100%) rename source/{ => tools}/sced/BrushTool.h (100%) rename source/{ => tools}/sced/Command.h (100%) rename source/{ => tools}/sced/CommandManager.cpp (100%) rename source/{ => tools}/sced/CommandManager.h (100%) rename source/{ => tools}/sced/EditorData.cpp (100%) rename source/{ => tools}/sced/EditorData.h (100%) rename source/{ => tools}/sced/InfoBox.cpp (100%) rename source/{ => tools}/sced/InfoBox.h (100%) rename source/{ => tools}/sced/MiniMap.cpp (100%) rename source/{ => tools}/sced/MiniMap.h (100%) rename source/{ => tools}/sced/NaviCam.cpp (100%) rename source/{ => tools}/sced/NaviCam.h (100%) rename source/{ => tools}/sced/PaintObjectCommand.cpp (100%) rename source/{ => tools}/sced/PaintObjectCommand.h (100%) rename source/{ => tools}/sced/PaintObjectTool.cpp (100%) rename source/{ => tools}/sced/PaintObjectTool.h (100%) rename source/{ => tools}/sced/PaintTextureCommand.cpp (100%) rename source/{ => tools}/sced/PaintTextureCommand.h (100%) rename source/{ => tools}/sced/PaintTextureTool.cpp (100%) rename source/{ => tools}/sced/PaintTextureTool.h (100%) rename source/{ => tools}/sced/RaiseElevationCommand.cpp (100%) rename source/{ => tools}/sced/RaiseElevationCommand.h (100%) rename source/{ => tools}/sced/RaiseElevationTool.cpp (100%) rename source/{ => tools}/sced/RaiseElevationTool.h (100%) rename source/{ => tools}/sced/ScEd.clw (100%) rename source/{ => tools}/sced/ScEd.dep (100%) rename source/{ => tools}/sced/ScEd.dsp (100%) rename source/{ => tools}/sced/ScEd.mak (100%) rename source/{ => tools}/sced/SelectObjectTool.cpp (100%) rename source/{ => tools}/sced/SelectObjectTool.h (100%) rename source/{ => tools}/sced/SmoothElevationCommand.cpp (100%) rename source/{ => tools}/sced/SmoothElevationCommand.h (100%) rename source/{ => tools}/sced/SmoothElevationTool.cpp (100%) rename source/{ => tools}/sced/SmoothElevationTool.h (100%) rename source/{ => tools}/sced/Tool.h (100%) rename source/{ => tools}/sced/ToolManager.cpp (100%) rename source/{ => tools}/sced/ToolManager.h (100%) rename source/{ => tools}/sced/UserConfig.cpp (100%) rename source/{ => tools}/sced/UserConfig.h (100%) rename source/{ => tools}/sced/ui/BrushShapeEditorDlgBar.cpp (100%) rename source/{ => tools}/sced/ui/BrushShapeEditorDlgBar.h (100%) rename source/{ => tools}/sced/ui/ColorButton.cpp (100%) rename source/{ => tools}/sced/ui/ColorButton.h (100%) rename source/{ => tools}/sced/ui/DirectionButton.cpp (100%) rename source/{ => tools}/sced/ui/DirectionButton.h (100%) rename source/{ => tools}/sced/ui/ElevToolsDlgBar.cpp (100%) rename source/{ => tools}/sced/ui/ElevToolsDlgBar.h (100%) rename source/{ => tools}/sced/ui/ElevationButton.cpp (100%) rename source/{ => tools}/sced/ui/ElevationButton.h (100%) rename source/{ => tools}/sced/ui/ImageListCtrl.cpp (100%) rename source/{ => tools}/sced/ui/ImageListCtrl.h (100%) rename source/{ => tools}/sced/ui/LightSettingsDlg.cpp (100%) rename source/{ => tools}/sced/ui/LightSettingsDlg.h (100%) rename source/{ => tools}/sced/ui/MainFrameDlgBar.cpp (100%) rename source/{ => tools}/sced/ui/MainFrameDlgBar.h (100%) rename source/{ => tools}/sced/ui/MainFrm.cpp (100%) rename source/{ => tools}/sced/ui/MainFrm.h (100%) rename source/{ => tools}/sced/ui/MapSizeDlg.cpp (100%) rename source/{ => tools}/sced/ui/MapSizeDlg.h (100%) rename source/{ => tools}/sced/ui/NavigatePropPage.cpp (100%) rename source/{ => tools}/sced/ui/NavigatePropPage.h (100%) rename source/{ => tools}/sced/ui/OptionsDlg.cpp (100%) rename source/{ => tools}/sced/ui/OptionsDlg.h (100%) rename source/{ => tools}/sced/ui/OptionsPropSheet.cpp (100%) rename source/{ => tools}/sced/ui/OptionsPropSheet.h (100%) rename source/{ => tools}/sced/ui/ScEd.cpp (100%) rename source/{ => tools}/sced/ui/ScEd.h (100%) rename source/{ => tools}/sced/ui/ScEd.rc (100%) rename source/{ => tools}/sced/ui/ScEdDoc.cpp (100%) rename source/{ => tools}/sced/ui/ScEdDoc.h (100%) rename source/{ => tools}/sced/ui/ScEdView.cpp (100%) rename source/{ => tools}/sced/ui/ScEdView.h (100%) rename source/{ => tools}/sced/ui/ShadowsPropPage.cpp (100%) rename source/{ => tools}/sced/ui/ShadowsPropPage.h (100%) rename source/{ => tools}/sced/ui/SimpleEdit.cpp (100%) rename source/{ => tools}/sced/ui/SimpleEdit.h (100%) rename source/{ => tools}/sced/ui/StdAfx.h (100%) rename source/{ => tools}/sced/ui/TexToolsDlgBar.cpp (100%) rename source/{ => tools}/sced/ui/TexToolsDlgBar.h (100%) rename source/{ => tools}/sced/ui/UIGlobals.cpp (100%) rename source/{ => tools}/sced/ui/UIGlobals.h (100%) rename source/{ => tools}/sced/ui/UnitPropertiesAnimationsTab.cpp (100%) rename source/{ => tools}/sced/ui/UnitPropertiesAnimationsTab.h (100%) rename source/{ => tools}/sced/ui/UnitPropertiesDlgBar.cpp (100%) rename source/{ => tools}/sced/ui/UnitPropertiesDlgBar.h (100%) rename source/{ => tools}/sced/ui/UnitPropertiesTabCtrl.cpp (100%) rename source/{ => tools}/sced/ui/UnitPropertiesTabCtrl.h (100%) rename source/{ => tools}/sced/ui/UnitPropertiesTexturesTab.cpp (100%) rename source/{ => tools}/sced/ui/UnitPropertiesTexturesTab.h (100%) rename source/{ => tools}/sced/ui/UnitToolsDlgBar.cpp (100%) rename source/{ => tools}/sced/ui/UnitToolsDlgBar.h (100%) rename source/{ => tools}/sced/ui/WebLinkButton.cpp (100%) rename source/{ => tools}/sced/ui/WebLinkButton.h (100%) rename source/{ => tools}/sced/ui/resource.h (100%) delete mode 100755 source/workspaces/premake/functions.lua diff --git a/build/bin/perl58.dll b/build/bin/perl58.dll new file mode 100644 index 0000000000000000000000000000000000000000..12ee9e490ef149eba28bfb0204f8684fd327ca33 GIT binary patch literal 370176 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 oN`u~VE@T#5ai{w+syB( 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

D^5K~-R|Hr{P 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�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


COOvTimc^I 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℘3`>{x~VZxogfH6 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 { + if (/^ERROR_/) { + if (/^ERROR_GROUP\((.+?)\)/) { + $topgroups{$1} = 1; + } elsif (/^ERROR_SUBGROUP\((.+?)\)/) { + $groups{join '~', split /,\s*/, $1} = 1; + } elsif (/^ERROR_TYPE\((.+?)\)/) { + $types{join '~', split /,\s*/, $1} = 1; + } + } + } +} + +# Add "PSERROR_Error_InvalidError", so that an error to throw when being +# told to throw an error that doesn't exist exists. +$topgroups{Error} = 1; +$types{'Error~InvalidError'} = 1; + +open my $out, '>', 'ps/Errors.cpp' or die "Error opening ps/Errors.cpp ($!)"; + +print $out <<'.'; +// Auto-generated by errorlist.pl - do not edit. + +#include "precompiled.h" + +#include "Errors.h" + +. + +for (sort keys %topgroups) { + print $out "class PSERROR_$_ : public PSERROR {};\n"; +} + +print $out "\n"; + +for (sort { $a->[1] cmp $b->[1] } map [$_, do{(my $c=$_)=~s/~/_/;$c} ], keys %groups) { + my ($base, $name) = split /~/, $_->[0]; + print $out "class PSERROR_${base}_$name : public PSERROR_$base {};\n"; +} + +print $out "\n"; + +for (sort { $a->[1] cmp $b->[1] } map [$_, do{(my $c=$_)=~s/~/_/;$c} ], keys %types) { + my ($base, $name) = split /~/, $_->[0]; + print $out "class PSERROR_${base}_$name : public PSERROR_$base { public: PSERROR_${base}_$name(); };\n"; +} + +print $out "\n"; + +# The difficult bit: + +=pod + +mask +**** PSERROR +0001 PSERROR_ Err1 +1*** PSERROR_Sec1 +1001 PSERROR_Sec1_ Err1 +1002 PSERROR_Sec1_ Err2 +1003 PSERROR_Sec1_ Err3 +11** PSERROR_Sec1_Sec1 +1101 PSERROR_Sec1_Sec1_Err1 +1102 PSERROR_Sec1_Sec1_Err2 +2*** PSERROR_Sec2 +2001 PSERROR_Sec2_ Err1 + +...so split into three sections (0 if null) plus final code... + +=cut + +my @sec_codes; +$sec_codes[$_]{''} = 1 for 0..2; + +for (keys %types) { + my (@secs) = split /[~_]/; + my $err = pop @secs; + $sec_codes[$_]{$secs[$_] || ''} = 1 for 0..2; +} + +for my $n (0..2) { + @{$sec_codes[$n]}{sort keys %{$sec_codes[$n]}} = 0 .. keys(%{$sec_codes[$n]})-1; +} + +my ($last_sec, $last_err) = ('', 0); +for (sort keys %types) { + my (@secs) = split /[~_]/; + my $err = pop @secs; + my $id = join '', map chr $sec_codes[$_]{$secs[$_] || ''}, 0..2; + if ($id eq $last_sec) { + $id .= chr(++$last_err); + } else { + $last_sec = $id; + $id .= chr($last_err=1); + } + $types{$_} = $id; +} + +for (sort keys %types) { + my ($base, $name) = split /~/; + print $out "extern const PSRETURN PSRETURN_${base}_${name} = 0x".unpack('H*', $types{$_}).";\n"; +} + +print $out "\n"; + +for (sort keys %topgroups) { + my (@secs) = $_; + my $id = join '', map chr $sec_codes[$_]{$secs[$_] || ''}, 0..2; + my $code = unpack 'H*', $id; + (my $mask = $code) =~ s/(\d\d)/$1+0 ? 'ff' : '00'/ge; + print $out "extern const PSRETURN MASK__PSRETURN_".join('_', @secs)." = 0x${mask}00;\n"; + print $out "extern const PSRETURN CODE__PSRETURN_".join('_', @secs)." = 0x${code}00;\n"; +} + +for (sort keys %groups) { + my (@secs) = split /[_~]/; + my $id = join '', map chr $sec_codes[$_]{$secs[$_] || ''}, 0..2; + my $code = unpack 'H*', $id; + (my $mask = $code) =~ s/(\d\d)/$1+0 ? 'ff' : '00'/ge; + print $out "extern const PSRETURN MASK__PSRETURN_".join('_', @secs)." = 0x${mask}00;\n"; + print $out "extern const PSRETURN CODE__PSRETURN_".join('_', @secs)." = 0x${code}00;\n"; +} + +print $out "\n"; + +for (sort keys %types) { + my $code = unpack 'H*', $types{$_}; + s/~/_/; + print $out "extern const PSRETURN MASK__PSRETURN_$_ = 0xffffffff;\n"; + print $out "extern const PSRETURN CODE__PSRETURN_$_ = 0x$code;\n"; +} + +# End of difficult bit. + +print $out "\n"; + + +for (sort keys %types) { + my ($base, $name) = split /~/; + print $out qq~PSERROR_${base}_${name}::PSERROR_${base}_${name}() { magic=0x45725221; code=0x~.unpack('H*',$types{$_}).qq~; }\n~; +} + +print $out <<"."; + +const wchar_t* GetErrorString(PSRETURN code) +{ +\tswitch (code) +\t{ +. + +for (sort keys %types) { + (my $name = $_) =~ s/~/_/; + print $out qq{\tcase 0x}.unpack('H*',$types{$_}).qq{: return L"$name";\n}; +} + +print $out <<"."; + +\tdefault: return L"Unrecognised error"; +\t} +} + +void ThrowError(PSRETURN code) +{ +\tswitch (code) // Use 'break' in case someone tries to continue from the exception +\t{ +. + +for (sort keys %types) { + (my $name = $_) =~ s/~/_/; + print $out qq{\tcase 0x}.unpack('H*',$types{$_}).qq{: throw PSERROR_$name(); break;\n}; +} + +print $out <<"."; + +\tdefault: throw PSERROR_Error_InvalidError(); // Hmm... +\t} +} +. + + +sub cpp_files { + opendir my $d, $_[0] or die "Error opening directory '$_[0]' ($!)"; + my @f = readdir $d; + my @files = map "$_[0]/$_", grep /\.(?:cpp|h)$/, @f; + push @files, cpp_files("$_[0]/$_") for grep { !/^(?:workspaces|tools|ape|sced)$/ and /^[a-zA-Z0-9]+$/ and -d "$_[0]/$_" } @f; + return @files; +} diff --git a/build/linefix/linefix.exe b/build/linefix/linefix.exe new file mode 100644 index 0000000000000000000000000000000000000000..1755ad395a774bc7da9dd335de94ff66a350cf78 GIT binary patch literal 135168 zcmeEv4SZC^x%b)41{T<`3nm&hYEbYiYN@CNLuwLOMa$ORK*0KmEzmVutFWus5+t7N zHJjsF+Dlq}FKx*MTiRl!SF30R6QD#aR;1Ko7k=5Srme-3f7Rl?x3d$`!%ur=xc0=5 z7e}piOnq_G^zbe7%kP-?XcM zpDE8fFa89cb+>#WOdNKJgMLk$>L}Dst9Z294(ryuj$w|$L$xIiOwfnyXnMuB4#I7WeE6!;h@u$6zwd2<|Ea`z}W%Vxv*{*N^+S+@Ybb$q>MA)GH@ zHk-WhJosLn24}Vl&Ub%-upeFkU&#;P3*HOoe4-jO7f$;fa3;1P?EX{WY$vKee+tfm zIym!hKv*Bc&N&TET<*cLHADJRi!Ywi zB$qJRv?t+PbT)jiV!E1)gy6h^$!PNRSK!oN1*f_Qu_vDoXAqOU!DNzl@EdqN{Sr9u zFya~~BF^|Jd~*p>Mdv~~XRtumvMkg1+I}(39ZAUV^hE0OzX&-aHl{-y(3&C-8bdv%HVFB`$)K zz68!bM$GyGd=rj`FHGNQM0yF6{gk=&o(Jc({cz@z2A{kh&h<@j?w$?j8K(HswebD! z3vlkF)BSnk`yG6v8S!Np1d=BmfO9e1yu1v~$*1A%*jID43R)h;+| zNyJGk^KcgOzln6y1Mpo<%yXG)iU(YOs(>@-r%h~Rh_7hD17RaR^ASK)k@$v#c=KfMO8@7@gGYfr$phrXtB;9GV#e4i?Z^LbXLkwk2P zZ78|%YB`kUY^VJjF@;k-h)5kuiSiEw9K2H)xJaK1%UBN_Hxa`C50 zk^?uvxqx9et%dL0+uO;_GF>eR+jI_l?eO4 zjA*8``0_}E{k8_aEW?)EgV!JZ7S1Iz;EZ6CE&COm@7KerBS_<`@SV->{Hq~wzQeE+ zFGtvpP)ssfnyXnMuC3`3e+1tO+6i$cukuzGqJ8Zo6SBw z7H?}=xP3ngmo2Z=%+ue@X7x?3aUD0^cwN&b0$28!*YD3}jsL!3+BRb6cl>c{Qv}#R@o)(_W zxVI(F6|UyXcm5_Rlh9eT@OXy&Usd+-SiWqtUe4poM(brXU!GJiiP+kAv)N#{oMC^L zVz}e6)d(?$Yh zCyG59{&DcLc9>&m=fXetmfPmsa{JsbYm;V7n|;f?|4;gf@JA1dB>Yi~@;&`k6xQOu zL~Jh!YXsaObFPpa&9M_f`Z~JVs55m=B9V0_qaM4n~y+A7UD`Wqf&|g2{|21T`i&Qzo z%kd(e;HQdX!pjgKp=L-L-yQd-!w=a|Rd!g9;ZFw}91V^{;1415+BaBhU#!F1+>G43 z>-~Sw(?!uahQBA+P-KQB8l5dK$yq9i4SLpq$e}8d$-V2D!I=s}YD9m~afb$JDkwP% z)h0gk_Y&Y@BJ)?uuj&pch_y%|S8|z@cd~jK3L!W{%5Nb{Vh68#9Y8 zH!gP>p7F-?6Eg)}O>dEJqQi}#tKj9Pi6`+bQcQ@cFh@RG2B|Aq=LRdy`%w(gtW=nSPHTDF$meEEx-nNGR7+u|T z#+7FsUwwCM=k`FD$H3F$HF zJ%&i2c&#sypp*z9NZ(LgXO85FZ_8T!#_J zm_L7AwM4_18tpFp?!)h&&=RU2qCF_ivnAb%^xlD->KxZGP=x}#-cyPs`gjd8A>h{U zacR*)a&;(CpRQBLOhFbInFyE?nl0I@&eD-2`Ucm~z0vJPc3j8CB`0^h+^u&wHtyd*aUCgbb?O@&K=UWP(}6_0 z_HST^j;x$(AcFXRiO|i&|8wA9r*}G2Ed!<6k>5bShHQ8n2hF|_HQMZUVAg`O<74=2 z+Oz{5){<1+kl*n+W@_Gv*mE!^R(>m_epSOgzZcpJ6_!tJfm2w$Yel zn!CWR4S{e6s?gvx62uHTh0LvgVw?Hm{=ItRUM=eB670+e;!ny>6c$2VN~A?jVtMUy zIKYPeg|h z5~|tfq-d^|*vkmr9NP}}(#^475uEua1R9z5D7Hm$ZB%MZ2%1Y327R5hL1Z{;9@rZ) zP0)e^pTH*`p-49Zy|d#mje@*^ZZrAEZ1!k|!6P%w#~dU5*OTyjWY}|S(Nn`cY)P%* zl5n>)sX0aJTCArXQODMB$Dg77y@G0Bh86es8TA?I<0||eli|RXmUko27c$?rXyQ*F zMfcr`@`RMkNGl03%o>LMnbcs5Pcb}ekr5D;A=9G@LU9ApbQBo?Khc|?5Q*X%D9k`x zp@+N6kLexS&JXQ1gN%%jN8eK&8EN=4UDX`HIcz5%=Ce^~=4lt2-5J*Cahk- zP0tnmaOIt1m-oTFAAfltlit8tjZyz$%R5>a%LK{1j|F`30D4g$s!qO+4j$K${0=0e z;V(9(c$#*5;D?~AFE(mRktsVtnwxeB>}`gPA9AG_{MoceAR|bpFK}s*TNzxRsSLU1 zW8##F`@2&^1kx3+?>7A1aet2yKwkr5CtAV`nSN`W|Tsl)zOH=mAXpDolck z4R?Wh8*2E?0)J23Zzf+S;{`I6fwcEN)gjWFbd+)1_eas{nTic@|E|;^z{CT)jQU;i zdi1~^$x>?N3z{=_TVkVEZ|sGoMAb-t!G}EKL670@tMF%t&y!>)0#G(uW&@QU0+hNL znN_WKAgE0JftR2&<2(2Sc(=K*O59Ee1(z1hlcln z>)dtbvwPU;P!PZ+A68r)LQ>GDp*kmAdZlolJSmTOj4w*|WJ@ydH^xvpulha9={mYG zhWTg1Eg;fi^f`T#rNpgW3Zj@DSS*dt*+%`!zYU$l2<+-|Fb2J(E?eR{eG;U=E({6r zqQ#g+BGjmLt$2W5^rVnGUb2LKf_*HZ5HC8K{G$~JE+YZ9b#m%&)-yAwfgT@2j8&hZ#bkC=#M1Mm(ZLwWw&L zWI0g9OIE^dr#EO6J%mTdC|Qa}o%xVz-MD|J-q@{0hZr!xnnQrm^rIq{W|_JSV$K+0 zIOF~uO5p9NGcS`I+|*wU|BikHft?|<3u(<$`VjzYV$P<1HSS+ZeG`49YAVR#j1-z@ zfgqyYj8Y95=GdDpsfMKkM9%94{oRK0B$xhA-B$YDXg;Kn^yW+I<*><>zEs?RT-;y- zYD@l%_bGSNfdH13BOJ`Ijt$mjctPz%cJ@HJX#$T2MPQ*%-G)(A-%uK_?}I2t!g!#k zsj+9640`l{HzTK~CS!oqzjFQXyP0GHAjfUd*KPx1&D+*#bf%zmU;ynk{Jr{u+Z5Ds zXt8k}`qSMCs^cj2!+y#rALs*dp{HGqXU94gjy628sifwCtWg}h9=?dTE(nr`f@Uo; zf;hWjqfv4jBI?$<5Wu*nQ5g*YqileK^T>Z^d-Qmw88^6R%$#Q4&IaiXJ2BqJqkX0q zn2g3^WgouY=t=|~t?ugPEztuN8xoT>m)=ppsav>4(^|dbI-0i_J0c_Ide?868~4<< zP95(c>>G7+yId$NN3r7ALy%O{>VoEUpcV^k^z#>jR%;xwHzRe;9g!jCZwG0#!T8s@ z&=#f#xQ)JqKNCy@(xEU-TQl^HZ%;FSzY9gJ$A}GmIX$xuBSv`HO7z*#jJhluZ_`-L z9|mPhJYbW=9P{JqMM~a2kDLxCZ+k|oN%Odl7XP2R{97F$B<9HRz_vvFpW^lC`I$su zYp7vRFx+z7m#VWRK9nvs7^0q{!IB`}C;fl=(A{5^Z|6~#j}5KLM>V+~0t?#VPAMx! zhvIkuYFj2zzqRfkR$}45Vo*&r_bHd5Kv9q3`l+yeI%{O&jlIwvz0J>&8S8xs*vS)^ ziU}*|8{VE-XYTkd#YhG-1@O%Y=m9f=<|QIT+=)5eR?7n=`wym&`CM%59LUwiHs}V4 zJ92EkxnM)0x%8XtNs8AOViOYNfw9Z@MXDfirPk`JZW&S2ygmA+@%Ghxzrt|^%*jwO zdY>MOWb0jz)N1=4F?tg#N8?qq`j7E;#pbIMvqx*KR|9?v;GgeIIsx~*zPn)GO5(EM zZG1&(v}xRHlw|mv=~}Je~C%FC$#tQ zafNHHQPd0H-1yb*){?)$*D@1Ic-q)DAOqAlzx*)c*SnboMcD3wX{bn`CkO-mH{Ygw z_w~0%z6kpN>IeUUVW!18W_Xuve0n%qXmjCQ3~!o6|A*JJ75Be;<>C!vV;wDDzXoy9 z*Kcfo?YfBj%FRuDJwG9jBaT<0_URPi=`3XfMyqCQd(w;>JjTX+PSiW5QI?iXMBI+2 z2LojN6tuAMma&oSW0UE#$ z1MzSBZQvM)sZk~m&cZW17z~Clc4!@HFz6~I0J^i59Wx!igOP*2Gs3R#)j|O(#n=(< zL4jd8EQUYUv4Sb0S14_NJJwN+z8PJEsNpN^9t-7T^hG{L^fY~u%N0Fw?W|ANXydkE z8MLia(i)wKIhh-8*w{`)R)igPa7hmTZVp3k`*)t)v45v5gvq;6U2d<6&2H!X%zoRt zRkW7=SL%1@k5GMvQwJJixMB;yOE+vhcpbpbo$vv7Y|Fw@{eY|SI1FQkE5WfNUM!Cr zHeztiYc~boeh2CoFQS_lN1PIqSDu0Enc;1qeE4}d4K?Ald^pU9x3kk&lVC8(AxoTg zQRRvJ*S-P6yPfS!W8r9b>UN7ejV#s@Tr>A~axo!tT&n{HEGR`)Dj@m>;vLUq-+gyc z!8W}&J8lD35`LgL98D3^sL25EjOM+Oldv^Et3`(6p=Be^)QgFGvZ9@`^xTTals99BlJrwZeEbxB@^!^+J7sFmMtq`0X0&B$5%(Z7+~ zNIoUIuJ{SYT)R!pJluN#taStUTm^ho)?KmRa`~4zn|FW& zutwWWYqvMzVY5Vh@Cfm;fGqOh;M5AgEHRtdYkdfIWk0U!03SP|up_bhP;#OeUk*Sx$ z=V9Uz9{ooU${|XJJABdW2pOA1$Qx2bw_ddgIl-XYkTp+uN$9J0mq)O)$8Z+MOumfZ zMxO@$#5%Qqd0e|Q{?r_idDKV`nqcFi~;hhKrCs@)GGex}-ro_Rr zrUm;kOh(y~(V*gc+TJKn{O(G>XMQOXl30aEnT6%vjfJha-<|3nP!sa2W!$jRjS@5L z$yREZ*O3~W+K=EjoZ}qHL|s|LeFczGN%F^`bV7cx4{58=M2D{Tfih~oVwH%TYM${+ zwiuQq)XJMLxAJC%G!$55$t^T}5M@Ey<2>#Rai4!1v>Z?fOB$Ci9MaV2Zbc0ixw+DD zI+z4@JE;2w5aatGt2v=}kAYZRd{5yN{rOBahE6Yn9)5Z@QtdwgyJIn43yJgLrb2VDStz;13Qql z7#kpcFj9HMzH8FLO{+L8?3ibjVa}yDmOCP+!Ocd;K%OD37AZ^A@2oSo{X%*W#%>R? zD<}*SFKkQx9XH*0M7B7T5k6!H`IQ2$!O_0#08L`tYPM8Zq*%E0Al4*2E#H_)a^pu` zUaA|9oT|TYok-j_8_e5*)s#QFB9tlSL9N(o+EP6fSk@mSV5#be9=LLbeO~P(W#8% zfnEc9Jk001SVJy?Qqar7R|uI2S+V}Ig5;H<;YwJPx>$TvFWps3yBdT=x~m#Tj99pI zSB>Y{XLh}dSdbYTog}E3I-4Y*hKsW~aN2jG0So-@6?_^+J$!>XNIXUfUn@)Y!o6!~ zJ6~4NuUDCHp}-kM^Z;W#EN7ZGB~rpVbcK5#{}DsqPF4ofsXx7!5|BsE!<6@N=@N&P z)>7UO)zf?lYOR!y0t4%tFhtRoexybf`B!YqKWTC|`=sh6J*u=t!aKQA<&*Lgb`qPo5Ml1J@O<{9&FPZI#OQ%h6{MIZ%#<1)^V$Zi3(dL0*G&M0VlkeryhN z;z6(v39Qc%sY3B=$?J-I0>i+vkOVJpv+zrod7vcl@$usZ3cD`;+j z0R;08=ox2nkPM%lUydj8)1#eyCUGw7o)H@77;0m%SNj zeL-4L=;PnuUuf=qtE_DiXg$i+aY;dZU%}QB%mWz6 zN;u<=)Th+Isqmer@C^pP+LFTTV4K<{Wm)1f()JI$GCBfjyw=4{EPc7`+GXIy-n+i8 z8a41@9ngaAJ(7sblg`JyACv-z8PE1_koG(LxTN3@9)d*c4~cdA{l_!QTJwOgo%^79 z2k{?yfNEYhaDbW$Cb8M>&h>e0_a17#?C>j0en*W8j%aOzYdK{#1d?0djSWJska;|2 zxk^?;3_zo9S)Ch!9Hv_`vSfX72Jk2)AA$p_4B37MwTL*5k>azg%*LZBb#&oat!6z#YkNYdn1cwti;;-N{Ys? zE1!BVJjOf*mx-;UyCFR z$MZ;Vz9hE^OuG8?4WsLz#!4uM5!iaA~+?TpoWN@WmJ5OO-lZS2C!PuNDWEORJ zTK(#oep<~^yq!85gzBm;Mtu}Pdv@mvY7EbB&aB+bpkv=v*-R8iYjWT#d)G?L>~6o0PL7t-&1@@$HN4@mL@8&+sCLmaC~a#%tiz+G#mQg zBMZU{y-t@RgI*DcBN$1`WgBWvSYkCUG6{VUHE~2P&6A=!W*q0Lh&*C^K93j+p2{aR z#{*A%O7T(FS?a^F%B~On?^7Sk_{0rI0iPILandtV?tK!AgMPR7NhqW+&SS%^yYhty zO;zmcscr9pwZDg=JUD-pGjt6V>v(c6M5+14liZ6+<5Je!yca0pd)M2HOJZoWi3dz< z4%Rme!scMT(Jb)Z-^K{PnH?Rgy|D&sDnCAW5WWlu`v+kj3lFCsJs9Yue4y0q@U}xB z(m%~Zld27`It1dC0TAWk$RQ9< zF@=r7TsUyl@2Sfl<~8#VPY~1^=DYm8tPp0!_GAfs59WcfpN6khd1#@!bd*CC!{El* ze@`%+H@<7;1BXGY>ZwJqlG^w}ttA|+sgMwrc~uVkIqXIlV8Y{BH|yV=ASf+$&MK*F zTW=tS1#T^Jz7)r!R2(-{98}hqkK)b8^C~OAG;LTl=?R6q`xPL~+>#G$H}#qCa*I_T zJFWBj8m;@f8f`s(598P0H~u&HMBY%VfxLkxo~2m=YPT!m=_;gApPZZ;i2i}7od zJN3(>%#SmS$T*dr=l9M#T~57XArcF+s2e$nE6Hc8a2yH}V}9;D)O*#8^^qA2x8nXg zJC)W@PI+sB)!+CpyMJ=sWr1Eb>m3-xqn}d)PRP9TCya-MUaixYsBxLB8Z;l1ICrYn zkUi&3yS2qIk`EU7n>ycuY|z?+K#8)CMcGqa?ZHUKSx*VWv7pQFqaf1}Sy|*i2aurI zyGBY2X~Vj%L0#>E6UKN9?rN67f%A08e;GJW91uZCClLkFTcI>rbT_w1O=*a$M>JG? zXy+6jP(Vs6i)e4UccL^EPU&Dy!r=H&y%8o!Ikv+9Hv=$mwc(*j3gs6-rz=EDD@vCqIB-|2r322=DG4jU6*aLAD9ky6-m-y-x@ zl*3*xu}6Ar+=uML_)j(~Y&?}+tKQu;xm6Z!n0WwiP0&2i*MDWDu20Jv42(r+GOQnY zn{nwLS7+>oUN~1;E7wH}8|#JimO60pkis=suhb!tF6zf7P&XHl=i?kCeLlP}qQmWx37EnNJE^NgV^9(j9S0&O;oX)0e zFJ<~fKcvu4&KJ63a_cc_&a0?Bk4S6IlP>5nt{Phb>S9ynRbxSKPKHI{`S=&;6@4x0 zgtt9*usS$wbsjN={LskU)X36D($T1$f$Ww3G}KnPck5fzcZUB7p~C~flauxVohDx z%;%DEtC*9`CAdGui>&_vtt9lkDB<6V%`TFqOU}BTpf~Q&pmW-NJ@P5Nai2zY3N%8>nO_6#*2lv$6AnXY~>B*Gmi zSWdkB{d;*GIrTUtV(7fO@RWR*mj%Wuw?K@o3zz3ZJT?I0{dN0+oT}bXKUFGQ{Wimb zwfLZQ20Ja_?d?>w-7D4Hyy%E&^6=*!eeHcj`u1V+5d3QKpZNQiyv=71o5sSAF&NU! z14)GC`|k#TMhOcv*APTN2a;_CsJEGCRe_Zi)&5+M zR9iM0U>+47`;%Nxb(o(~<;ra``x!)V-fjgPl*d+u6Ko7Tx{s|2W`8erm_zb0pizYJ zd;=NpbR6oj8SmBqWN~s<OQe0sN zjxCU_v5CneFbnGEF?|{cH?3Ntc&}*ak-3ielTs&{Hl=L!?Kyi zh&nSQHT}mhbU$l9EtRIsF*YcdGZ!kxUYxWU8(jyC-ICAP z^Q4`u;U)E%Jf6l}6g)l2PJB3?zBoUz(yGBwuM5|?Kadu{`k-(t7SLv8S-vsHLd)~s z2@J01&!=G)AeF9PcR*T2N6J|H;wJdxCF~uk+SD&0AdZ_i67J}`VHjg5uN+F9ja}T& z!ZWV~o)_S;W4UuO{}#HVF0;rZ53pf3sCL&^P_9nXJ%%qWGOxp04gG-wu$clQSA10r{;lFMXn4)Zi6#{^-#EAS2;Oq6h+=bxET>?S?II4YERJb!C3}`d7o@42X0)af=+>{pByPa>WUqKd!@d!Da&R41aHh z-{kIdxzz!q-Tqfk-lFgRtKK;R*TI+tf#n>j>U*%YXFgH>3C0l!Ia&dD*C66|Y}u_@5m^d#P=tgMFl@GO%(!hs|q^`jyNN z(j-m%t}s*bS{Otilkqg)Are=Jz{!TV~gLMFcXSep(xNv@56Kxk5scp8)ttFD{dgnCJzdO({i&7xdW`}9v3shEIs5g>O2!d z?r5QuZR51i&+hm$I`dG=1OASG#vPyJir?z_+;tmVAJMKqW736VubDJxX1CpNBk&^TvISEl?c>WNEudyhGmrldzPOPdl3?=J+-4n` z%W!=yKFPz^d^||ZY%cm*>VdVSB=-Tj^(ij5nz)oO--hfobL0OJls8DQ-SYLk0?;_e zsDZ*%QyMhCV*!0+GUj;C_EfQ-%pbmgXTc^68!>IEp#?XF63D(O$*A+`#2gB&r{Z~I zQ_NxP#&)}ES1|8bqm548r@QOW?gf;KVbS))?92bJWDl^W&Ea= z)6|&ZU2Rd`AtnSo5h2}n2sjoO9YDHlgU2Xx?}wPikRu*3XL!cQeNqH@lprwpO-y7k zuxQb18*Z>lBvQiM^DPz&mbi4>)kY8q5q)Az0dp}-?<@w+_*IbHYWI;l4nsM1b?^#k zpw3|T9(}1#$WWKYP9P>`0uFsNS;dFK+f`dCVu?vz;-f*v)AWLK1km7;tDr~N;2$J! z*huIMJ74%kixP>KO*cA1)?8Yh(4&KMSYrjo(1tOlg-vH|1Rd% z725=}l=3}c`~2Mu!1Sxt-I90?q2Bdvd~iBR`@JW&-P=5i`9rf{^7hWc)AJaIjc@pec)C95|2;%yzwBqnZxrSYy`+Ufo;++_5Y zE8fNcBStqKy9Tblj_zRZ{V(I}vytFSc64IO{kQ^FEtGqolv1~Af3MZNPkDmY+SRqV zRTr=r!rZ}DDRRg>1x+QJw>+)R7AY=f*)rPULM*|8gKne351}j=gua1Z6@Gwzr#bSQ zc}$Q<5VI)gt%4{3fbk~A+-(cz{xYCey7qFa7mf9yxir-saW1RJ=KWO1HEW5Di0cj@qosnzkoa7da+1{sqph?w%!yL z#Cr8DPMpk1odAHQ7Z#&Dgu&7bV4!sMCiVVY^#kWd&rZNNVLmGK!3rVwP-u-<1O+%= zd!YmDe-(QyQt0{St=orMjg1-kHiRZG0W#EzwN9QZh=rK?TjxekO~966PPY+n(;K&G zjhKoF34kuJ?ba@;#$)$M=)D~7x_mc$J+o4uy$wx zT!VFKZJpgogY@wBKFZ<`8GBSu#@C&iU#9bYf@ z-v1KxBqPBW=+(X!xi@(SN#pMwGZsjq1Mrdrdwd9vOqBNO!&Mzn5$48YYk^^|k>Deg zXnP)yI&=HKvonB=cIl0~q&0WS0Cc9L4d>FX26StJZcBnGA&dy8&|q?$JQszOG#9Bf z@tAA|Sw~mH3A}{7@(SXUjFKf7?0CkMHvAK%1mMhFDcDeY(dAk8GmSPTz!pa?cS>UK zbB>2AHoOcic$c-8CUu(C@eT)!g`8cbPbM&LmRHeEK`!{a7agj8TfB|0h6KiA z%i&Mpbf(Ggn}LKZNshR4xMM%+ZePl(U?fnxdpJfUmJvrAQyYSVCJOPywnt7iB-;BF z?*GG0sWHOp9k{TZp41iTs;YORp z%kUF-cKL--k{1FCq$HWa9!@&T)fhxnFI1yrC1TG538*9z18UDUYW}GTzD7&zWCy-T zjcA*&pRWl~82c7cywHPpS|%4=64o$3utYgptZBmyNKj{{A0!_`LGGp%o+l}~ksl33 zl8)QkI-!+874jLiY2&I)Jhp^oN-UK+@4(oy4PPWsg9`@nx`f1If5hHC41t><-N2fQ zQH02GQtToE;TB|xby-4GPk#|xv1~{zoeGSpV8HDnJI;?{y9UJ+3J&5RScYioUm1d!OrgI6pzEOvFTy75mgdu~in1lLZHd4`etH!AXK( ztBM-8#X_E7X-Ka<)sY%~9pAKj$1fbBuVZ1g`R5x_>is(nfz)5tFbu{PATFL*sFLQ| zBvq<_RlG{j54DFBiJojoVnY(^yK#YcKdu~~3o}D0M5*?ptq9Iv~I`PcigRz!Ml#7SLQqu9i-OOtJhDk)+%JFxD*OKumyV6#*6#vTKCgmtPT)zWLk2vP)I zJs-3X+MO-5b3_KK|PqZu{;tB%`cKfw4 zqOPIb{0YPlghhTFFBj*xMEVU3FFmh zBQWl^k1NkQ25R>@Q)lK^rj4PHU_=l!k5k1=eg%z}Iyq0_#r>op41~^KF-pobk(I?| z3WuXvqk<9XTEeTYyMyMxC!}ay{%%wmpRC-60!msVu+@AhjyFttzVy`^t#DzDHXgqp z}4fhNmUX(K*9P=Ebz%dH^6DdG@ z5TfMuzq`eW?^L=4%{rg_iax%6`uJ@66!SKDOr?uK zpPGa6{3OpP`s0DVKOWnDb0GQEv+l<`2;ba1gae?(ezUj;9_7Vv2hsUxU(w#?@9(2U zv2ZO+&asY2p*cgx8j@w4N4&bT*b2bA*nby7^>i03l)cpxvF`%2e6o@&wz3zCI5>a> zd614sG(Js(h&Dz*y9M`B24J%k-a*j!VcdiA8_ZA2WK&;2j&IpHu3?TL;w?_lFU{r2 zM2j2#o-LWe^+zlvxg;tDtF`BC#PnG)U~yNQAmC+vD0SQuLBNAO5F&o| z5Q{gagKZ`Hi{Lh+mKTR1S-b|s=Bs_l&=m-jQ>>gc!|X%UIK_$r>*IM+mai;5t~9vH zmBJ=P0zF`!tuTZsmr8C=9tav_g2i5@qg zu&~2usi}uWu2&H`&nXPZrK`pb^qlVV!Lnl07B8o;^2aRjec1SDyW>ZO1Ana@KNhF| z27v_DnnvHu&9UC!V+Qkd7FL~c9f@^+#oN9g&Hd325%I==2)x-5FAa#mn?xl1xK<8i zb!(OgkPGs@2*e1(!RzIqPtOr>2 zb#yh{p0yG&MuKnHIKUfZS1^s8Qu4`yA286vj)WcCVZbL6tN`Ez6tm4XzQbfR9qFxd z1mQJ*_f=$tuC)#rm}y~79dDtv;ZL!! zTRmZx)$tN0YK1G{+W4fsI7W}YjxHASco{wry@4uo`N$CPEWR2g7x9OyC0 zap+8`AL~_=m|Emwel5=`1Ozr(l;Q7{ejnIsAnmXX*Ns(L3h->?lMSHQUKG#9YL+Y{ zDO^E|XH;4O!~QrGJfemWj!XI;XQap~jAEtyI9DVr=bcVz7>ZA&AqOG9c|AD{AODIy zk07!HpD3fvTe9ad!N3p|TGGj^0u7+Oh8Wg@Cel5EPofxSLv;pM6n3E@ z5(yIv&^Vo!Ex8`-fV~98;d0viT=^09Ee<`x?Z&-?;QCWi%)MGA{B z2gFb}inHViC5Gtdeb5kWuo1%Y1w(UbJhltLWJx{;M03xalPfek5wp-jLcc)yfrM)u zh~I&*1y(%$jL)6=i??k<5HsL27ex_?_uH&w^s6{XE|iO1#Y)C!E(*yu;eD2sjD8gd z?FTbHto?LY$@t7gA=$HdpKc|ipK(STX#(>t>ki4p%E3y>Iv|kcMIeiYKo$dm%n^aa zjzA(pZ%w0@Q^kB1@}Vx=3n4u~&Q?XqSrZSDvoC_lFmQxNmOHd?2SvLQljcj305sSO z{Q5e&1e;m`ljVGjeo%x6m8=Wy5sRCm=M8|eUPr^0A ztt!gs#omNP%3s+V;nz8W=I!bo!@w-*_Yod3Ci2vf+}9UTu#ow+`D{$ioIBs*{!G35 zG{b}48MWHx$(=5xfRB(4JwGClC>=k%^YNX#MKis+nil1jJ>PZdO~Mv+UT$XFCs-O9xq{7K07 z&7S%7c&z4QeQ-$t?vUg6D+_QZZ1gT{7Y8kxc2lE|gn36B0)|##hm|@NWpOeY(^`Yc*< z>hmG?D}kALAOL)L7-|ftzqM|Uc?+A4n^~;uJ25y_iYdgKpuGb%ZWsH>#3fo}AtIG& z!*I0-`x2S;*}>yZmcw+~990jw$XD3&>P?t7kd!_TWObNihvf3C}5qZ*GQ zpv7fT7B(+5^L?NX2P+<0r->8$g8<>dUK3OXJJl$ExQJ#2LxZ1!h}?C20^9A2l(Fhe z>E93NR8$71_%hle5G8{?Myg zj7XgdGNE38=eN7qw*faYmmxTfmv~_Zf;3KETkxE{+T#DwSaASf{-a)0|F?z+>-)8H z!#fneFS>m|W99bGTHofSZY7La9g)fQz2rffXTbPQGCqt!it)KclU#ZOA*^6!?14d> zP_lWJ-$RGV=$FDGmNkj!)Mi$rmZ#c~p&QZ`p%C_;y-k`QC~(sy0_8)lavJ0wS2lWq zpq8OP@Al~(V5!Wo8fHjajM@{6_GP(#&UTi{s16*xMzHy^6hX++Cp^VW_1&i##WI2? zTrWVU=U$eyuoXV&x<2Gm>6_l77{JjJp$0aWl}o)L@Db9qpp@(K*!pIX&y95u1-M(o zpcx&wbr;qySqI6;I!MOgS4wfX9r)$M1_EH+XQg19|A@lxV_-7jr*d?FkEEcz3-eHy z-$Wh3E;zQeSIwV+wliIbfnQny`&+Reb^YWQTpTO7@wyAi5PJlLa7yI1!zg0j_0u~G z^|yvbu09NQ!@sw6>I;P}u!`;#!~R~Q|68}#)m(?c3FWSED9j0RzJmu%_dMl zov=I2Rx`(|Y{iks;0mKB^{cLizgJE>kx%~!zCrw#a*bIGx_X! zRCVcl-X4I?B`wx6ov1K&_TbD8CaRd%75L2w*oLLQP4QrDRyip;eL&*k{N}EXUO1pM zYN4ZhD~(OJXemH$N96qst@UrWpvU0gu)hZ*Y?MZMnj! zZ!XZg1o_q+a(o*v2P;qxeX~>VaHP^cJLT zYGhgI+4$XoUo&z0-8bH}W#baoINz^oZ-ww1fcX>wIc(TO5CmS5fxjG{DfqQsUU0_CEmsuie-Y}v zA=LY?Jk%_k1=HVFe{t$>NGr7DK`zOILk&3`4;pxE>N7o*7`&E9XrG!KL+&O2RqxeYTb9|j{j#=QFO#f{xJ zM=pdrFXD!KcceIViG3V^Cobgp47QB+IYd{pPtlx+kRdWSVspBar#`69oeK@c-biX6 znNqq64^FiKUT@qBO~znKIRhdaV0Y=SSKycd_I+OIz5fdmw+qKtuJ|wMR;S?sTML(L zV7A*!Lg92Yt}=KY<2kJ^`tEmeCK}Vd+_4_0V7Lwf^i7r#Tc8iyuRAc!&!xwtqR&3z z(wE#1lt4JKy^qE$n05A-E}1sEOy>c@daXA{^_Hts?v7*5x$J_Kx}4TkN#+2^>f z(3|`>f$GUahA%qx2r^V>OF55t!ya>308ruu9OS_ST8fPQ>HS5*D8nKnj2LiK2UM%> zkA{5+RIBFf+ukLeoR0k#;gv!qt}ya|Gi-MUZX(Os>+6j?K^;2e5G6h-#tTQF(yH(O zbk$-qL`tUZ1AQ=)DDxseYgA@MLc79e9+(h@pUc-^%j!>Rv`g_j5x?v3(-F26zkT?v z!tWu3X+w_i=NJ&~EN~5YFC5hWI#|5!e|ZV<@fJ|z4L+_X7DCIAL_=Z!X$fU0Z2SuJ z+x7}HYz)TeP)R(p~LYU~Jq`g&m-04d90-1T)kflkvSE@|w? z%E@?P5{6gU192N3F6Ym)s&&`z zb<-MPeVM3t7VG6coPk>C3ymI~W(4PF{kMrKyN2wQ#AP^-&lKW<0h!q3PWCcx&3ce{;;=^tU>2sbH^ddR7`nbKZw@8+fDX^7ME=Vuu zX;pk3hG7LoQ{hes^fltD)xKM|d%Eu1i6t)nrFOJWXDXQjHBER>)9{hQu0n?Ch)%Y^ zL4lesUBVb_-(yS@6W)nRG>yl747uQD249OZHBG=ZthwMAgC_|RD0I2t`xtzlAc288 z7fivJDiI{#U@$fZGRsy38zuDBHMp}lOn_w#f6odA(70+-5xHRJLQnuOWlhJ6NG43P zKQ89@5M2}e!S8Qw1I1BW!(AD0N3dZIwscIKGVMWB;nogMA>%n|b*5f5iX?E0r>Rpy z1DW|WFd0rk7i3KD}xR_C;#ZLUSez@Rl@apUgApU`9EDM{7h4`Az2Y zSXgH3$Vsaz8vpU#HSCjwyvOqNqt~)KaBmsbuDN?M^+H25>=7w|u9)z|I1q%)A6_Hk zfSkzB)+|SMdKF!q_+xh40c96LcEJ^3D1n5iN4`#MENUi~AeWF?sdAL*d9RAs(^ZjK zVM5qB)4=>Gl_m3on%{>_Z_#ori4`%|ka>>CCwEt&6aq<6iqzG>hfxooSwb^ab^>`|6*|Y)bz0x9{CEvFD+% zER6!no`-NLx`4gop{sBWO3o0yDoBQioY2mv+5~`2aeSfe-Q7+=kqbRgB@!^D^ClbK zM1nep% ztb<*RE0!W>M8%69g6AWX)0WSrwoX#q#oJ6E)_55ewP_siNYh-+@NY6(NuJlD#nRNvl!`vb)aVn)RP6?LNc+{1KCg{3y-o&$7g!S52pU zjgHNhEQC@goBN=_Qa?gCxja>(mIw6o0?}a*Ob%8Fv74J)8-|$aIms8XFPmvi2<(HgVv(6A8F7`Cxn(*rVYVS;>c<27 zaIzy;e{8+9DCmu?5<-|-6oj}#il_=fYXa0!5CUDc7gJ2gBZxW>qSsOatRND?3L+tT zD*~pHCgBH=+^#0K;FSffYARd&aG=J9pxdOH+?~R~$OOfDgXYQ82#P_$#5PqzAe74g zzaX;F4>P&4jNJOS|-Q(ml-9D zYT7^y6Y7`E$AOq-o3Sql0O}N$QNL_+ZQ;<=iwXZ)5U&NK@jexJJ+{T$d>7KtWZ`YT z4L-05za_Cs7CA5$ti&~I1-zy0p{B-FyqW^GaQ~{feoq%`(+L zA)@h#cJ3Ri^sn+J?q`EOMJKgqUQc(U2;wbB-mVonr}(MiUtjuh8``2?F*}=n5%Iu zoiOG~Bk+)neh(q4vVK+L&4&LWeS9`D-3Y7%6YF~%xF^XEFBV1JoKQbxI6=y0kP=&^ zE-(VCWjST0KSzNKdy2m7v>cPHL?n$H?A)5CSFAe4gYGR zh*gtK6-c)XW%0(Sze$Z;O@Ngc2};LPHgW%Q zy>WRqa-9)aj&8vM$Ng*c#x)vt#IQ)qIrOhlXZ-X7PRyU{m*H+1taDZ)uNHiH^HigL zjamxV-zq@e{fNhE`4(ti%TOESZiiG`AyA_PrfJJ!7FocO#VDz;1xmIU#rT)(m>+W7 zL4W3a5tWtwT-LCSDOzF(I?d!S)QD13QXPf`?Fou(p``11E?027?OY z3^3%Y>;HDnQUD?lx9HKP*lv_C!-M1V>vaTL9-&GDf>A&DWRFb|*0*XZn#&OxsXQ9a z|5Q!J?X!;PIbn80^YJT%yn59&RQn=>aPkSBFt_xW-%@clx&e9d1^AnKMq^B~&Mx%W zpDMusWKRRpyN{cH9QrOMrIp1mw!kJ7<;mmU0Rrpsm7bq72sc;)4UCg4Q{-Ihidt@q zfEf7o1AvhEIg~Yr8J)rsTN@t_sb8&KzX{m$f-??z7|fR?r7OtN6u(HUb@pLOG#^jV zBv~7)7~bX+@Uj`JGGc5<#JVxPKrs$JV3A;W$ZQwn?nE13<=nr;Dy`0NES`s&Q@TtWQqFb_lsKtcuNQAL99vfzB> z*!;ho*k~R3wO>k?cw{GY3-p-3LcqtjMf?yR`zQh6Pg{O{V2;GDh8*u5t$NJ<)^ia? zm9^YDXMP(Wq`+=z~{6K?zUh=LI@R!j-`Q)rm6jui~^HanU4lwyjf>wm`6 zVZTDuZ4%XDrwmWc#oU3I$ULKniNhBmI3x)o48G1Nk>Jq?u9M&e44y2xhf8xf7Bch# z3x_9%V=;qIuyANO9L)%hdT@|)PKPyIb``RwtetU%Z`}5|MsU!$*XG8yqZ4`m?LsGs zQJgBkn!op{jS1J{&hCN<5r=2~NMmMk!3N`%ilC=5=$i*qLGPrwmA{?$DmKdXBUfoE zBAvVlI3DfxHg_YZwJtbj<_Bn?O$p3|67@Ul&^Z!;9UO4M%!x}JppB<$8rhh|Kg#!08Zl@V?d z@!*UV=A8}9f^}KG;cuPX4aT`&9Axg04hli7VlG1#8mdw#2qCIw>)Gv}WAUJ)!KEcMqz({+F)1 zN^2@#SomiHDW4iVsd6V!EbL4+3XT@wh>Ujv$@DcaA$CLk8Mi(5X1uX)(e=hJDyA-R zRlYR85JJZ|P+R%R!XAi^SjWN|Tx*ZKYuE)EeLSbVs};BKH*d!c0#Q#zuaT{Msc~eh zucdfUYtT_s-Ml^em&%tG79_4lukma~3mJ{QGbwMa`ddRO=tYjBksj>;E!ldJDKEK; zG5IX;QAEi9sI)R3^Ik`+34ji;2ZtuT6#!giYR*dd7 z?ktl-gLyQLy=nY1E*PS_+h-FIB+Z}52~|A#9QHknBdWg%Yj~^(BRcyVqlnMgmKB8d zHh&iA$-tL0n~Oyj^@_B31+u6`Kq?T`&P3sDxtOJRjRwM-5Rm;1AZH1r1CZg>IiMvH z$o&LH5dp$W5EaT2^8-v@n|NgJejG5p@j5C}Mv3IH7%+7L^N=Ke6v^6)dFqJp+Ce*c~K|1pUe2l^9n=!L%5MQCCO8${6 zAWsj<9%rp)lrh`S7Bkx!r7BxYlJYZ_EFp{pP4rpRXckD*&Vqnuz20W3aH-h?!y}&- zc{8Onw#B%kEK+hX%SrNlS;xK(KHMz1MK@!(7|^WJG)s&bF7$sgRQz(E_o*qxSh6c! z>q0f-Gm6bq@!AuTjTv>*71v8nV?$kM;O8=t-&Bs(&(U*$b*9z-ERz>e^ul^f!o{K4F zf?b7-KrhkQbGbw#P%vP+DB|j} zQoo$Ui`Z+?htYRirw@O3&GnaViwtU+JUp9nUCFiK zBB}l6ieEm*4I)Oiwb)_YkZCC{t-d@MMCbP^a4?JFa6W8YX>QMuH7W!&G=|rLTrlJK(*>A=7?Lt%Mn6rA zxG_L%_0bE$I*{0)T!#16S$ThEAS6u$)%m69JU|l>R$5oEWFTl17a zmEyrJmX9#ARzw1QWHZcPD_IRW%(H*zl>X^4;=`N!YZP7#zuAOUN~nh`gmzVQHJpd0 z7*Cxjm9;Ah?Ng>#Ex`m{iwtiP&u9Nw{j-QOHJ@wP*^;&3Vz46CwJ~gr zlS6gck|)U8{L&C^4qB7vU!C(OM0r{ziTlO{OglZ!MD+2dT%=W>RAO#8LJ}`x89pdM zQGVFt)~rY0JJcT6v}r4(qGd_gp-gjn)w2)*_*Rr{kh3-|WlI7|qi3D|T1M?#0X~Y=*?qGP? zD(*9oe~0<^Pq9I*j}LA3Z?((=ZO;QU#DzV+*!M5Q7#=k56E<)s5`4u?@wgV7@Me{S z<5RZ7l!d?oKT`!80G#f4DPF(Rwh;Jt2F({PWeKo^vomDABc*|ouotET+~hCzfHS^L zd%&~IX^v^c#N*$Ei<%JvBfzdYbDt!$jR3oXW{VZD30239q#^Te6@VMkyh||2ws~8Oy7guwz5y4{TkVZo#`sPjTrIQRp{A=(G!105q+>(!wr`{SF4$4 zPLLwO6on&QkS&-@t9?qbPh;5CtL`9<$jOlCMf8TuXH;u<6-o@ShdV$VbWF$)Tw&mC z=1vrqH-~Vnz9IV7?GxiAQ!vDPpDG*#G#GkIjG|)rZrw7mpolSXalKEKT+8_Fk+b!x zFnn6%w64Obh$pgkhEx;GSSUch1INoMn?S7wxuSZW#eM&SWBreKB1-{t|0=qK?^#YW-d5FPfQmAEVdqu@}* zK46ESc?Q%{jxI!OwGt4~8sBwGhYvUTuVAw&e$mqv`09bIUgL)6g}6^ZVVZC+HrN0= zF!iQ(*rAttW7vDC@@35bYwvsjtFF$w|I0s3A(+qxrIqScpkh%(X)6+`BycTQq9G9N zS|$b(OfV3Z+zZ%>5-(W^*R-~i&AzW|rP|JR-D*3htkX7FCScjSpuAn$@ov%5?Z(U6 zv`tHFBY8jH=lp*6-h}YSKl{@zH#xsQ=Xd@-=Q+=L&U2pg9F;in?^dkbJ36k-$y35E z_0uGY&W_7yPP8)8J#;9^cFs8e+bqxWq_}@Co}J#U)0FIP~4{ z-pEto)&;y2J~i$mATo2Lo1g%z)mfkvHQX!sw37Q0{BM*08qtvD{+C<*FQOTAFXbpc zKP&MHC5Y|0Ecv0+B}ZaP1Vk5fVnlq#&evJyL8LVU{QlV8BMD?4HqDJGxJQ7m#Q zkiQi$-~Tek|01H7Q9v)TD5HRPdcAQekP5qJt;uEJ;so+a z1IIrJ;Cn6`5+rYp*->>6^AcjD2oj%=%h*sdp@{2dXM<%@$vFAl#n=E`CY9vr+uc%T zd0xF(*-R?2Xm?MvHXwpUA7ji}kK`!QmQF_|smxgZlHxs?k+D1PM^N6jS!0Do%4IB3 z!2F!&EkwQ}MmhWH_a_j6YdV#Yb`(-HP?DFg^849LWJ)0|^^$SLO4;}Q@2LoLh9ttq z|Kgi(LAeb*ta4fs&A+KYW6Pa+3uF5R<}unx8Sry|Q$t%Edli+#$-L$@ob7p^`G=ChAoK0oq!!^e?r&p6l!PuO(Uz(6+;2KgT{#Wb(bc zk2CetX|bRCj%787xR;Ek6ZUi8v5W?DSo^y27oYnZ@+MoUo>ujjR86`Ey_`wYnR1p- z#L~bW`_CrroP9K>EGbW#E=AmlcXXVc6CTKU*5;8D^P)ABg|iH;o{M7p2TJLmXI{?= zt7mUe&q-EKEx470d+)Z54n1cp|COi{w!G|exgqxaKpEgW^IRM>j|RCoXu=M1C?lX8 z$SDtzhZ&D~AIwFY^`m%ripIh4G`n6_-yzJ-3D0~)cubug1K0D%>VAr&-geSB!g3bS z8N6H%$uYcdv+JD~#V6=H+EL5jlh$@QQ}S<#zZ&~>Zqt>=e!$7ak%H+5x1Ftx$~{@pU&Z(7 zOx4}G6>)o>p2xP?$XUPmbE1!N;a*WVl3DRxuDK%}SvUj|R{n=H%Bb9lw@$F3rl2J+CJd`Oma<&&qee|**PXoPW@_uQZ$Uc*d0>Qc|Y8EF=RbknuF!pjU zhtsOO@biHNhOM!kDZ@s2Y-r19f3uHV(7i#!;x|%x=0r89RV4mj0GEDE86qzDo~|ZDvNa##=3hs!H<<@@dTA? zicAfJDNYA76xuKOo}qD07VaeNJOoKj@d7+zM;ZIEfkXv?JT@H)mLz7p$6BUmhFFyJ zDd*Q-YTf{9f*wJ^4e?dDGm1^ck30_`S9p^2HK(2jO8%)OqJ;|mAq`+ zC%U9M!5-&NUkEAaYe8B;4$bt_ew`!2B8v8|Cto}R#bKA9$W3{H zrKTKqzfuUP+(ntUKwe%(X7u|k(8N)?4x+1%K3Y{IM`WLi>8xJ39zpqGA0i@;7pV%v?o+Qw|VKbUY z^OJHoee2wzDdbNUDQFv?(*D4r^g_=L+qh9BWiDR887y{183$`zCPi=Y%AIb@LZeN(Yr6@PKG}0Vynt~1hTM{c zfU(2CxG&Uvi-BgJiffp;Z~KzmE$qD$mhRiOM7UY(Ux5aUb(opyCoCL01mBaZ zPM<92!|Y2#St+Nmap(t2engC?Mtij3B9UX=yln|HkS^=@I$#-jRTrC|3tMjkXtB9Q zb_=(b34-GmLpyiBR2ZKi-<%tukZ6F+Lw@dUQTLbF|3PTFtEGj0@s*tlJGLS}K28sU zv&D{=6}j~GZr!F{sbA{L_J#9>enG%(3+KDoD1QU;`GRiXf$6#9mW4W?Wf8kGpM5G? zKo3;N{d7`Vp*^4q7xE-@=lh&DLYn~Y&GIp_(5VVNh~_gI7U_X1|7G?y{w3>V;1Tm z7YcO}^#c3U2JL|bfvdoL`B9l+)%Xujl1MQFUGZq=_!>KAc1TFgLELp!*r!#;uxf^oT>xg@5*u7f@-$C{(2mnRw!7$#{T$sme5+cf_(t+gQ30liZ9Xqz zQJ*bB!Gko0k68nCdrFyD!(;hd_)O5sq6JJAa<5HAZfd<@O>UhR5?{oeR=QNPVb+v~ znaYlR9Ql&W-OAv0hFnQP666He@WofAli8$PLmrM{E6dj)Xe9z09}x>hl5kghv-Lsg zovFn4)NNto^<}V7l&`J4Tk~5PlRvaK+@-Rp??9Q$4;_5TX1`sg5YYu?4tLde*qpb# zyZwPIoAXv3@dpv@T=K2hGWuM%Ib<`TBhKPCT}vHJQv=O>AwS83P=VbqON^3Jf$XwR z5Jdvv7+`jAIhfM%%uLZ0;+nA+_^h{{iMGZIEhmb z21~x~Z5coaVDOV>2RVtnb5cx$xlOt zT6XtS8k-!Uby5H?B958KkIoM?LaNCR3CO^dePuGmS46w1ugtT$P}$qN;Qj^H{2Hda z_io*;5tqc70$}zRX1%I=d)fS4s8shhxOH1Dq}AB2jaNQp_9vlTZW1a9i2Rw=F@(Q0 z$Z~2_I-{?KZ!@*f+Hsz(033lc1g{OUz{Ux6m_Z*kp^k*x0iGRB;aN8_m{1L>p9kI&-SJuBkd=N&r`y6s9X+CA7j} zl7W6FUxD}!43)3+r{ydCj(vc!J?z*AJvsK_a86af&psT^DepJ-L4L#72S0_(seb=Z z_Q4VlMl?%5U>{DC1?uV>4mY53b;R&V94Buxq^lZId{>E&`Dx5v5Ux<_q5d;8Zn2i8l02L4h%!Yw; zh#&wULN)>u^Ft7(~-N3&0sbH zOVMkLI~3GV^+;RAK+jhVH<`1EYt3 zXQSovZxagl(uM4q?xZ0nAQl}^ZCXT#Ec893gDn_0;58)zgweF;Z3zBeNJ+E~jeyAJ zcTz+qSrtMVWb}_iju{7$52cC8P(&W`;pB*nK1rt#xi`na1tQz}#($r&FwS6 z8F3%_1s}FAnZMrdkqLoEZmj#b%Rqu)%K$;iV02|{uK3ujyMHf8 zWjI4TlmmBZV1;7(?g~GdXNxN>ZbjlaOr1o9CS8=&-X1b$VE;iJ5Abg}s^$HltOze9 zRDwsH29&jMFH@Q?!N~_ApnZE=A7Fh`z~n$zdzO5|9^&o#RAPlMZ2yX4RqczHVd;67 z%|7DgyV5C-vBS7~WX;n;(bUkVT`jxaiqq5Pncvp>s4a4v6lQPuapmjp+=nl>L4_qI zL`wCR{fs@(bH_y0lof-3Y@EGitXyD<0jL zyu-0g1A|crZfES8!N{0h9HTeb(_|?!Q+EqFZS4+wcdt#@;$bKwx?zD9*;WT zJ!aRh6>pA7&H{nfbu7>MBWgxXue+OLHdSRCTJ0%*pVe8zvjuFsZ--zI+q|dfF6R7u zV%>#NP5|4ZLX*|2%IY6%q=#7VL2;wRibm=C_2~(H(vYyHO{*n`#SPqhIbW!GNmXYM ztlffj<=GS`+|{GaIPvnQTTjY@!mXd3--yv z{Y_(b{Yr&6Vy)NT@{-r9eM3)}?J#Cr65HijLx#HhA4^lZJ{z8^{`@WQS@9Q2G>inICr{)_xD; z`3reoCr@nwWJdQj!@aNdye24Ne=G9)F#}O(^E4;FGO)e)%2*u>)aNLv^Gb{jA7~37 zz;v>MY)bk!R{PinQoa`FMM6K0jV_uP#sT=ETs{o8l*%?J!b;d1-o^4<3DR1rs=L>L5+_=XoV|+{7);(wZ)3VlE7_KXr}J#Taro(Y zySgh=d%O4ii;kp({Dcpba0s$3?LA(yB$rfvs#ItpL}N(R_w{^$kY})1|2sDJ{%2Ij z&5zq9mBh3MA{i8{kRV-9cl2S~&-eRvGi_H*;$j3DX_G?IT)Uudl0JEBZVkd5A3UB8 z1C}6Qq9N}=c(S*wpiI~#3zqrD)H2h~w`mJ1VN$cg3eOj^lm(-VX~wbD-j;`%ZA;>! zc~Kws&b_->gz1ZCGlQ75-x-@T_8Kpn^z^l5CC3v21);=`5MHs#tS!uB{VlQ(Z}7S- zfS1-zO^fd$A6|8~V(EkIr^hqF5!SJw1`YwnfkS}F2QC6kN-PIJq^1TyK4mZ$K+d@Q zln=lHiMf*HY`CCqp=+brb=SIf{OFKERpsyWeyP1?xfPSc1tTcmSbdQsrIOr;d3M-1 zKh_Pz>iMKqfTP~rDT;+p?n{54Dk>1Um^iy%&3DbUt-MbsHdg)ex$v(T4*D5FyyW=p z;rwmkzURWflov&3M+u@<_U9pF)iyos%?wm9TgGq4ynbSUHDXZfU>;q z$%1Roz&IE6tVsL~gEZR6ZPNM4XG6yTVqeK}4^mL4vYGfYV|t<#X%61s!rQkG3ttf! zN=LMlR~WliL_gerN5{vr$^gpC zD3t*T@hjjN!>O=sAh-DwWOK(0GZAI9-}h`M>7sF>q!0;m7K>z9g-_~O?;G(de6lPH zE^$7+r|?O{RJ{ZYET)>@lB{d0dN*D~Vujz{wu{6lQsI;L%3Sf--OR?ewdgVVeDVuD z8$e&l_$CM@d-IOcENZEpdaX$OOz_#0`$z=u5et4+GrGHe!Ku*d_yafWA-~ma#o;1S zNWPf(37`k0x07nmHyA3~*~&{Jz|rl2*^Tw1W+NfP8A6YkZPt9~=}{*A5HV#H{^4Ko z)L!+^a0mj%Av3MZEc_4vLNPpySK*TjvjE^6m;$UfOWaEn^jZ@z@y4$#>zZ)y#))_a z2E3ow)O_3h2CNs8STgMuY%=1}!s3sbC#C@$+ozel58>~#p$ITkCLSYV3Xmx%bNaeH zlSBr1Ss1XbCg8O4^A}I`14?20xm3 z->b*}E00KcONTl7^WHqGED)f#9*@4=y{j<>CmaBcl4ytLzc$o=pZwp2|3GwnI=t-< z)_Dsj?o$p5O@2%G?!>??J&%IGu9v=jkzcsAAmtxQlU@;=J74+$>z`mz@*je)_x0m+p)KwzO;>5V6_J8pgnL zEdjB~6Z+|wfoQ3olTIWsH!hUh%p!_V&N?vFc=`1bV9M8WbQ+Y@C&2^ltzAr&nB}T4 znH~S#Ano4PqkL2mnc42pvrQBA(DICZqE^il;udUsyL`6Ym)FZJ+4)?n?xFS_|IDpz zM;|PurpLOA0N6vkU9XM|EO6hTq-~ba2{{Je7iL{!0X7!7B0aZtg5{L_hvdVk$%^y@ z)oI_+k74ynGtt~`<>4U7#HIAV*q%vJGq*~+&pY~=ybcL!{_$~2a7kjiMG9$&&!~o< zWL++OXV z8(6g8@7H?Uc2Pd}%|+V&z&KT5+x;P0GI@(1?Wz01mJ%lpU+v)K4>me++qIYtIPRO@ zlK17QUfZ@?O5=Pm->WyTr-VVNN6gb1*6JaG#td0Xo33>aAKf_1ujiAWQ7vN67rBfb zId|V;yF)HxzZjJ+Zgr5z$4SIMn1W0yd>S&bM5>Y_)df3|OtA+NU;M@I4n-bHqv-Fk zxndkRe!}>Mk@Vf&VKv2TUQ6`-ObDC1H&0$7;lu5|kRBEXHo@DDU@s-MXIEe(<*`@E zGCJ4o_^pd5ywcP9d6$!;VZL91l*usj{qm+0F`N{8cca{m0%3X4l0@lQ8m1xr#j&{- zM0V{hpTgF22=5EQ{FUv!VHr_z3?#-A#M!d7Dz-UBEFe^J!sI|ZcVJsH`2!B7CU7(NY& z9ei3hGbCAD2>{@B=?tw-DyjFy%O??jBJ+oCs@}zOh`3m5ImgOBkr_lPFlt?$LI6|Y zIR{%3G9U8`18jcsA~x3&Q>U7v`B7EGvpXLw$Qe!VBk))&Z@7bq!T>dAY;y-&qw2&Zq#BGQD-!?r zCw`MrCW2^Uw3k4rvm1B3Ctme5fayp9iD?|z=?V*|^Lo}0+EwmppxBWCMRi1^J!sbp z9Zgxes-Wd%2~Z=~#Wqj!BJV>aR1%(acb*v`4qBGVl3fR>1(@KvG>N=Mje7dIAYE!J z-$mts5zyI{g3kF>g3edc2$uRj2zH}0!6xX4 zsirYiso6P^?x0lwEd+G4J)#MrE^pl>Wx34?^)R6rmST4n3?do_-@Tr8yi#ME`j#fS zf!sqmmG_q{EZBIR&Gn(%-SGnCijT!MKQ<`436CLvZ&K1>B`x6yvykrCU0J#8mx6MN zqel(;FN~OmEWN|=ihg#$GywtX(T^0x63A5oRozes$^F%J-RQxbzSG8vPF8J7#y!sP zUD!TeL<+5)+#S1kF9{zgY<-oYv!4c?lOOZ6CabQWFM|^f)6HZ|QHhZNb{#B6)q%*S zol47^rc)DpwznXY(FPw=C(cNm&W!zbec1e-*j&XbVya|C5jC)f_ykMMl!=n>R@mry z7*R|Y!h!n&qv~B0MsQ}N6bdj7cd=}953?-nD{9I%aQjlP}o&V=^N~mNNK2=tX zDxXZ2wy{oN9%o$>KGZzR77GSSmJ~F-2g=2H1FR$D+>n0_hb5vRi^mjJgFJ7GVfta7 zl2%BaI5@1GS?nNluSW;VxE5jAPk`=p?W}fz=`%cdLYPx^Al2AkH|4b{$!d zDCra1^K>-ej0n;1NFeAPM54q_H)@h(7}YdH&v}R~((mN>Q> z!s11yY|o;vZtaNN=sco7MNEO<@X;w5w|LgK29F=VJEt?&J2>lEOlf|_%gSnrB;ut5 z#Jpw8yOyB+8_R{02r`J+X1OC$)wTK%(Oe`&$x`j+Q z3{vx}=%vWS3+75%ayN&%MmXc*z52?Lm%k58wpSHw8*iweyb-R3FH9+9Ydt>hQG~J( z1@>5HwZr1dOA>fEPRCS8v5R9cv7$z)uN>?eyFc1@>=*Ig zV>MGI5@NxW;$#1sbFk^062fg{_$VRlhO8TBy%2xy){i|~URFJDaG9LxfdM!;jymR z553n@ILhbn!EaEOC4|YMX6y@K*yz{TJTAmsdh?wO&*}4?*=yT>;(5=k+xUSv?|Dh$ z8$S|rn~Ui}4b=XjgWy8(U6(NDA@OmCjzhhQTPhRZ`Bw#nukk(i=C%mKdYYM9NCWc? zYs;v9n~TOoFA&Oao~YSHdPbZ0AbBvKOr9$)IK%%v&L6HRz^jwBx51B$0^Wc24*51_DG;Cx&VBA6YBg-2b)>Y}jI>`7P9TTM=p4B)}{* z;j5*a3}4k{BNK!H%qjB42A%=paC&IfF@cNiFXIUx?%iH~Y@4)LO$C{uDIaJ$ z@W$a9z=Qf@uLb}Y8h{zrY(8oB4b*~^h8c{Gig$CZ#P?t$067pFF>}%z))xOO6=9^d zaQPRHiJqr*=zGTB1)0hBnom-Wq4V&>g;v0#5ewp1Flb+74z%w?TbewveG!qw4tmFa zKs%cq5OgbO>f%}ZmsF%G{^=icScZC3@vIjrSp)FT3ZG`)`J5vA`mvzE+xWRAtMJCp zyfxVHZ1EXWwg3Z$-u?C)Dr!kQNgL9^Mrc5T@62F*oUOA!nT;zM`UGG5J6Y*Wyznog z5Wx{e!}JOKFn^gDM%n;anvrHJE9q|iTwd(qhtBjdr0E3T0p{51_#DGi@se`T#7ZcH zI)S#A%d!Dqr76gA>Bmi-fXMk6BAxYuJDbkbzVM>Q5~gho>I5vtqfYR^%SP1RN_7H9 zuhA!fq)^OENPV>Kh=bH)|C|9Sh>D1l6mk1gS_Gm!+IXRzF8SI87Bp9XW#Wcz9||-C zP`E)PnN1u$)Xm>`659k6E>h(2(4ScyQ^hivpba009x>XA0D=s|dx=jQRFQh3UG*mD zcz|VwFLafHTrm^{IZQH2;m0X!cH~^H6Cy=i&y9@XT3FaBF5SMVmrRIW9h*DJc%2z= z^`Q@F_SVfbhJ|9CRmIoV~M1ULwf_ZR7OJ(V-KH<)z6yG4-6R zr@;AV;7FO`1v|B~uD~!<$tA+sBuFA#$ByFKBJEW+_V!j)FZ_w~+Wz$n+ zytaelUnppK)((niTCG{<_h^^oILGjvD{!&bnc?>7_mz3S!gb<)gv+ObT3Jl}+!EvK zSz8R+@Xg$V_D7#+BATHBvO2Q_A%SYhx%dmx>c1?-%YTBQ0oJ3$;lm0HWO3kja2Pv~ zs&oeBjJ>7u&*q*n6}0k9RDaTRI$`*cKuNTC;~y|B13x}I+wfx+H z!NUp~?zIXeug60O!KBzqo_s$Z!Uj#0Ey@(bfIkz)!&r5YYj5hC%~+GJrdcLv{pXqk^Ri;5uSXq&}$Dt?FQ$Dyl{+2H=2=i|6*dG_+M^77<# z%f{v9<>bB@+BcLWu_e8Co$ zSEjhrHFKp2Tr|$}LL^kA&6q_k`yptccu{gjY_5urJP|E<%Zf?EQI7#-uBzZgFao7x zvGk%7;WMTRY$OFr0??_r$TxyHBgbJ@TX2icPyQ?wym@K-2k{6~)#o&Ai{CY+C^{B{ zmF^hMyvn6M08E7$L5XC9^nxhq>j)Ze8)+ zV|JEaU!mSUIk@Jnd;u49tk3{>`$8IGemNDDTi|rN55cz@$JK|^g;*R*a9Pa7_ z9)~%z?6R%Did=B)Src~@=iNe;6nkf3E9vO0P%-4-K3?W+N@~6q7d}%eRd4=uA1${Wz;IQ4b>aOmnU0M5u zVD*_&G~8$4pC?Y^ns8q;>y3Tde6^&GzV5!~=5ea^^R9d4AD= zuI(I*)&<9umWj7F)kl`CY_Nwj9LSDbkesI3*qUDrPB;QtOS0`9Y1J?NH%LOk5}jSD zZwyAee~taO{8;ye@d9@sIILOmZup1u9Ix~?isDTB@epuLXI!r!;IR6AZshtEetR(j z$d|Grca2c6*tNR{BddbSUn`cL;l*s_TIGwa^6yGs%<^AQbp#%%ijUzrsCF2w+&sV+ zd+EY>v7K?gH}`oVrM?vpmh2$Rhq(~P_8-_L~y z8Se^W-T9F*h2Jh8jO`C?D@S!ztI6}A{{@BL4iApoLgQ=;(>DuRUedF|Rt=*3v#pBR zZ9e0`RvSf4-Wfg5O(H51n>y7SIo5p8iCZ`KXGcj;xy&P%BomhYoT#4`dd`E1DgPi* zfjaMC^qmgdwC*+p+mcr+OFHP1#4duvLb<|ZSz-FD8T-=BxIH|$4Kp>6lec!98iK#g z?>pn~C1k&! zAY?PVXR)gAJgW+!$lKk?0>Exb;tvd2;P+0z^}=s2+nw9;@)mL_-1=cg56$aakCM^e z)+0go?RuY%0pIeX!q^l7weRS~r)|e!uJKk~+uP+cefM0LAJ#dQ9(ro>swya{Dr#;* zD~-49`PKK9%WaX~w&y_>H~ToPzH@-n@%(iK%p3nvic;@$9LI$j#S@3OeTKc`h`wAr)E z(^Y=@^VeAFo3oP>lIQs7WguhldY-{6c{2sD$eE(b;msA#eI6|Jv*c{6G|VmAb~Svm zAT#;cGlmw0tubI6d&VL}-tQjrn7-N?i@HO6hrYE<5MD{gRBsiDc^uy5=tgqM$@|qj zt&u}cvSa=4vgz$qm+mCe9ZE0?9GIrJT4SL#*nlkdO#4j+$^38q=;-;I?bKgTqli4! z{Jph-leG*ECt;t^OaO7UDaav2m~hnSzXspIG$HfP@DmP*8#C!(VikzzH|{A$z1N1I zezEZ(+ZI0y89!r!cbe7`{bp7ziEF`5+nqI|?oneU6Sr9reTi#)T)yVt(nZh%<$}pr zGsh2W=5P|Pu;Wvrec2YWMF*LmJ6~m8SPszu(nsq&zLXg{UAD5YJz{hcHjw!fRyQ-mr8DIPm^AMai+eK#=t!j6vUE z3yZE-rJ0O#U^0H=Ga0{0zO!X+gXW$Dij0F>_)W`x9=&blzaa)XIVk3dx$Vf(Sy>&~ zk>cd}$h`=$B{{=A%u7yn4;@K=^pbdQ2us(d!nI(CF_w$t42x!Qk-d{_@8 zcF()~hsd%RJ`wCv@6tpmGAmi7N79MRPu`$M*488M(ZgB618D<=%hBqw(#+$55zbSI zO-WNF?$naJO5ABhKPgobZAkLk?A|3%>i_00<@97ix(ev7X?Ek+4d7l-^+4Fa=Z9M>tra zJV7`TF(Xd2d zkpm8RLpn|qaS-De2VC`=*z@zYRsBXBaIbN|;oq>sX%zF3QxsB=NUazf>8~`m)yQ@I$P=48LI7>Y~IvXTNa*?QGul5F=pPykkF?C0<~Z@6SV_P zrL@x?#K)|KO)Mjz3%ZnJI7`@u!r{p!pM;CKJbE^vj&*5I+Zz+`P+uEE>z}ilo-ipl zcuc%G0LYTvrvk{)6p$cP29To$kfRv@QFZ}9dIbub(6E_VP!o?SS>PXvyPaol);GW=ql>1Tcz1(}b_i^vz-p{?C`v7;2^=_x?UQTaL ze*ld^ReCG#e%zxqAIgdS z#Gv<6gWfkYl2+OLFzL4XNp|d~)(YD)Lf)Sdjv7!yzs-J<6Z@%Jw(wqd!3<`^Anm6q z!yeoL+#%dy+!5SS+#n8EPXgAHxKHFhk$W+Bv=Bd4#2xj&PZe-4;GWMtpL;I%+@Wpb zU^J1+hj24-3vdC9DK`+vXbXF%wi)fb;SLAoxy&-I?bh` zv)f@;QT@<L!Y-V* zIqMT`<&&f)#;aMOXsbduU{Xb*7D5ae&D^B-9kMfHN)sbji63lF?GQT*QJq+s`2620 z4jc5kZNr@;iE+gVciXvSLv`7-*KBY?pKJ{k8jK{dJFDk^`>a`W-CT;SnyD zo(xu;O{xOt!8vY)Ti;FxZ4d9Fc>}{Abm^(c53-^cw%aB;odL4Pb@g%P58G$57{b>2f8P4kfQSP9 zEsg(^g#S+%{y!mg!1691|2x5dlp{}q|GR|$ol4Dzy>0rLx#sS=P9OQZg#535ODTZ- zhRRlu2^2&YHiiF(-0s&-O0HRT5o-F3A3pxGacS#8GBDlNE3A(G{#PnMj85yO1@v|4 z@&i~{T9Krlhb$6+nW{)GqBhHR+Kxg&ToL@8x{*Jq+e!GK*zA(Uj6qpYY@=_H8!Zjn zsM}4(Cryh@PjHsZo#TK9!sg>h5@DD%BM0ruz-@Xw2wUCw@$3DP?Dl88=Ft_>}n~ERuH8VC0=z zHWVF7M1v1bR%eQU3q%35>+^`O22%Jb2`Noduk;d2f@sbTrqcPwaYkpbCH4b(Wr#-889pI}NIBRj>MHG;DZiA=;X(p{8a~gZb~qp^fh99 zt$Xbo84#hG>U9hbn$g-bLZR2yWq>F1<@KP+i1X#g{2}g%VBWmm=FM|cb7nVnHjK%K zuDZ#y0x{eSpFGRkCeK6d;4EUr4!%uxaF{r=SK2p|l9(BMm=v39aW&nx0u;86BmLBD zpo_d1I$5<&&AQnl5z3f#hl~RK)Ve3g=*C5H=r^$>2p?Qh9*S6JXipir5pNu-OicTl zy3LST_xZ$8CuwIUA1|LsxFd9+P(@Mcb>eSiCo*O9=2)+ zb155128phuqpV9z%8FdhbCx}Ok&Ei4h#Gly|4IsV6OA$@#(q^GOKs!AK+@XS=7+PJ z{d^uLx%R3rw^i+ulI5CC>&~YI&S2E%9!yMsxiwR%^&2loFhz=W7ZbFq7fV)Wq>G&(Xy3A)7cp zB%|5>6gNYaNo(>Ugvi5vdR9}zlIrg-KN2vZ2Q^0W^d2H>~s;yA-k zjB_cwK@1IfJvw66jUdj347EuGK!v~z3+44_I!QrE8N!z~EA;X>)#X9erRqUUX^v2r zonKL1%Y^ko5_f;uuM6@Sf@CLe9cEGJ5LKB(RVLbWH*HZU!uqrf z>S(b$sBX{+MbTK`PuaUEKeQw<)esi)5=eotfivFuA$xLCp!+hXlusmzDcf)Hl=5|r zC;!!fjemmQ)U1MG+P2X3!`;}P=(oxqPUvQqPeEtU`lxO;^t^Xg2TD^98i`x;(YpH_ zeVhKJO!@|6b_J9Z?m+vw+@_KX*UZ&4BeBUam|?Kn#I=yFqp~M&+}y9BNeC-AxgzV> z56<6TiqI=QL2Gv<6CULneTOXoRwQm^WI{~!h(5*U>I!w2WLope$c4c|;JJy3kJv(> zCH|)*-t%b-#Qqo)E92uwkIt@>WXG@0n%u+$V!}pdX5q?sv&v`-in8aW1Z>rj1RfcZ zz@aa?1oSlsW968j1SZIPFHdOX+Tx^|5yLK;haE-#LnRZhV61N8eLD%K*5#<;t;X_- z*VSTU?)Hkr#~nm%+fTK>vjO=R-&rN^k6nAeC+kQS95v`DYh!FI+rF*okxWzs1UC=_K^Q9`^fh|>{3&b{n zSj~olzemoTy9` zTOa_?Jso{784F@=%vN|x;+r~<*|{Su5_Bw_Y`gvw2#=3mBqmXcP^Nz%UWT+fvFlH> zT1(0PoeJ@^^J8N87A}|nSCgmH=CApUkN5*ZSu`L~EtAG$Y>xJzo0$O3(u|?)ur@G_ zBb&SNx$xTstZvSY*cL$$0FUB)&TTq}$;9+Lq3Z5_POnHln)!~3!WmA!jlLE!8XL}O zn=3sL##>}V+GgrcutaPGh0X3Wt7EDI-EJWHqq;9-AX*h`&^v^>6^Y%S_i?P3fzww< zh>ltFw#4ThB7(Z6+0sWpk9@37_N@bSRd$t$k8yH}6VF#9A}%qdgjBv)U_*|`mS89d z+h{BNzz87NgavHr|Cmrm8=*J(ry!f#lS(H#Q;3|pN!6Z#qy@`TzLAIhUod>{*+TWj zWv0}6@>j#Ot_D~VtpL5s!Y8q-{^T~ZD*IAy1U<}jSb`#j(H7gNLol$y3V-H?a zRlt!mD83}Jk{2e&>Z`o8z5BDWbbn2_KpRK%#jd=*dbXDhe(bw}38R`RZ1>-eBxPy5 zYj<}(Mr-nq=?G}(>h>}4kh6af`G>9hBTJlTGGmiTvf|ETEZv0d>o-;v!T6gG~{ z`W{*cuf~2hC=*EkFzY!Q17%pOAVnulHDgFG>XsGFZ_&hIOLWhzD?T=>oL!wrOzcWppZ(IuvKDiPD*)Vu7u#jacJy3MZl+4X+AK48}e?fQ^iAGYhGc74pQU$g7uc74LG zyX^Y3T|4Z$$FBSAdcdxoc0FX*F1sGKYqwpG*fn9-qjv4JYoA^F?K)sriGYE>UB%?5 zTiVe#x`uDX0`5bHbU=SOy)G-(KL-(m2pVP|oG1G%mZPm_MiyhgzJhaTbP&QqS^sB3 z*dKejh|Tlz((I8n(_W8GZ~Axh<{_(v_^dYC*3S`$686Npx8!Ysz#(Jp8@mru(6?p= z>nxRt#h){p;mZ~yE9!Q^VUlu1B54#4L0sgzy2s^-8dl=_DbM%TJtj}&xjvy)$O&~1 z2hqP4gp5KcAd36vDOYGlU(3rKlw|j>bD$Z0W1mH!j5m79FPZnNXDQ6sgDU@OQP?va zLejuKgD2Xf$9Bq^xQgMb%fKW$d**K?u_ zpFFD}E`g5HpxLk@Cyo4#ATk5YrIr`QUv6t_eGEh9$+3xZ{}h#KdueZd953dVT5lFv zXlwnNjGaHD>tJE)&nZn^hqVDq2_1hD6#KTiT)<12D%#t7*>|)g@g0mCX+@;**^lGy;f+}ba*V99O@ZQ2JNj6 zkpxxS!;MmjE>g^i?K|$nqtgG(_FD6gP6?F5f6sErjkgPW#1m~*TV70>YX%FS+VP;G z7e3Yc$J{FlpK5g@Bb;^U)d~4todVs)Gu)CnWypeqT^!Ebm*aQtN8O&N%iq{ zl=SPC^ob?iM614ml6LG!mvkZ)3DN+a7<=Z4pxnDgD7QYoj&dKfj7}_f2e5bp<<8G2 zcW6ktLviZ}thuQX)j#4p)Kw}IM_k_pdserVo&`3o<{%@c4%E3_IM}wZ*m;89c&^4^ zlX@}_rDJ&5p+0B_I~C~QS@t>y# zthUkbQYWFjMGay6z{C?d_-7my?>Q(6UM03Yo8eI+C#U~i_$23NyHk*2-MNvw1vts9 zqxme)vbdLA!+NU@-auie9mR4@g!92@4(x!=xs}+&C#{V_ZphDyjwP3J*afUCOlH|S zJNgcC>4oiQlJK*fPR8N>~RKh16}kh7^u^wDT)*^iu3*%9U+05yPbZ;I{Q(q zI388<>Uyq1NE-^QLIq?c^Hw$yp+cYFL%KqJROt2-D^xJNLQm2&IX~ot3iTyJBUgyM zl5P#PAyts1YLhOCs}1jdZP4Ktw}LVTwMqD#OuxKJIwKRT;zXa-QSyA@7dqM(c!SCD zeC&r2&_pV)=L%V`_>bUZ-WWm}{-ySExRWo~?Ga2QfAuK=G(UNlI;jqtVzNlr@Q)#R zIX7~h^-%2x2{15n0o_WoHN(iU&uT8n+KT3iAaJt4R)^2xtMClPeKvs)L|MXSsxS1m z6%T($1?c?AH#t+b`jIE%Nj6y^tk9Hpf;$}nDz)XaR==Ld=-DP`xZHTAMC5+?OT=JH z-sd>|4aNu^S9SN^aFIAG7T#5hzIIln;ZG}qb^E~yMQ}(WTH%3`a8VPuhXe!mg;nyu z`Xfu&rFXGQZw9!DUYj2ZrKLo>3l*>|U$#~d{-BBd=J;UX!Fp^L%;E^^u`PSLz|KJH z$SujXx5}@rmCfO7{O{ySq2cKc`A_k7eOXeM2SC`u$2i<(-&&qg2!W~aQ{PYwU!-Fn zk>13*2NKuy!Qy_2-DfP+B;q^lVTWbpuRB#4$+a^(e);L+gKK8j?W5$-GC!59io}oa z6F`ex0b|c7Hn2{Yk7LQK)D%QzfMJGlw!&i;%auL8L+{8FSSU+Z0HaQ-X%P65xPd^+ zfw5QTVD8rnN}s4mJnN7pmYAoN-)9U)k@1w$C7-CY@5oDzw0{XLR+jez9bPH>+)M@j z>sD`E{|EK5%#!Jacl-7~q#WhuIh2GTF*Z40Be`|6zM!oM~(4V1u*!PeZ< zgm%eu1GN2V+~K-|I-TJR=$`AZzP{0hk3$xAC)`|_eCck%5sj}79RQuQsfiUtcSIF~ zUP`~nY!n5@QaxZ@DWv5^(oW7Jnb+6^Covc_D@RmFg018wMvB~NOD`8Wp5@7HHlT5q zAsnSIF+77Rosuy7@b?LCT7vh{R=Z0LRw|nle=W_7p@GT_D=(4qOijnanv&e)w@MJ|L)qY26qp!K4`hqB z8$5ONuN%nVJRrx}?S`VF)oH;ej0a?$jdZA;zhvZvfq+H60)sw-33kO9-Udp_`y-D7 zmg%pf4wUZ}Hj=S)v48OAe+lbz><6)*W^E4_yvEz!tl4KrMCP;Odk5GVH3H@kAO6~j zd9ij{Z{=6}pQL*czUAl?h@Vf@O`0C51;r~8|6(}C+&+4Kx~r!(6_L1$*3%JUyD=Oz z@Lc#cdj0VkGG5fa;|PSTvb{CI4ds0@Xh$mKk9@7zbRA4G6W7;D`x;PIeThAzt4uXm zKta_WTFhT*ZIHPCUdtTmm{TabA-+S=Fd1|AIW8i~p?C=Ki`v@th&dOom5C>}`K{_= z4jsK`VA#j9V`#qH|KtzE?`UsVi4o+ZX7+$3A~AmAum12qY{F;w%EFYEINba~c9x9H z1^{1f05|AL@&YQFIvffxn2|N6(juN2B_cnip9uN7+m=5Ege{cbRirRBx9FF8m`;iA z*(jEzTAO?GKhEY}i>9MS9ovJ!>E50MZ3MCQXtU;$v_hsP8{-M7G6$t9LP@IcNZ}+cLx~2Vg81JhZg4k`FO?=Mh zEzjRpu8~Pz6bF4%|6txVIZh$G50eA^{`^PPtw?;*nwaT=TKj&~wQmQoIFt6Z?I?-5RAbV zYu`Vk-`aHWzqEaC!E7en|K|M12jhdZ;#FnmX|`=yK_tb zuzSes?C!|_c~{3ItYCFu9`nT3)&Ma$Ra9Ycs^%Oc3>c$cqYxN{z$gSpAutMoQ3#Ae zU=#wQ5EzBPC3=a#)t4ag8r-A%vvFD844&UBH)GZM z^>(l0IkG8Y&zsgZaGyb-TdJGZ)vvpKPUyzQNT@nA|K_Ekn);^NRguP~J1+}WuWW3J z@EN@#|3?5Xys3I^y<(+<&IwIzP6gVy(({^dtLry4)UT_Z5m~Dec;5WF+EsU0W-jom zIvm3rUC>9@YAeqCg>3$VJeX>D~RbkW?myC|zyH8eKYy6?@A zrXe3!ua8Dn`Dwp*ZDUQXzOGm{?ULm)FS*o3_X6)A#rLkRZx|`u>c;i8>-@BWAVC}@ zrE;&DRqEZ1(@zpy{d5nU-mBK#v959Bx=>|wU8H_(ZOGse3O6-1HjUAmrGBNMhQ?LZ z4WSLyP4(3)DbB{~=1{b`wkEW)78ulq>Lca_{3G?%4fP+dtx3gI{H2lVRd(@6m(!SM^+R)1Sh~kj^^^HxTT99jfL+zYUXw0~`t*WbT3atvw4Na>L zy(ctt)AiS1S~6zb{JQFOw+sC&UA1lfI-aduRJy*QA+%1|ym~cwY=QnD3aBD?24!ig zZH_hwuS1RNX$b)_w2E|Q3<0IU`MQ3~sOE<1hN#s!ytKl=q>`wvwM`9ohMKE4kX7}n zCV{m&v^u(Ol^_Uk8XBnoGSz|qXfx#{cy-8?ROMC>l{h0-P3@|N>LwC2ur{s}kX@iv zjq5hJ#&O>=BCT(vQ>np+M6RYQ1Fj|_jgZJ2fD1T&`LZ;UUte9{5CwZDPpt`E4y_mh zSM{GASC@L9!|A8@56v$1K8(|E%((K#nkYCSV>$M|7_#Et7Oex~^);cOTIw#<&CT_< zuM?mnW5!)ipAI4t_mZKVLS)kKGu2Iv(RDS3E~(CUi9Xw}G~FX^J^%z1q0+LZJoJ*B1sJ~A$e0mXtnD0}HfKC{R5P1*)GO5D}=>;t^EJ4E6&zk*# z<*VxMsBK>FQ&kuFcenq9GN5z%$N7y-;Z60Cil)X@watE4S=$U8YiomMwnWrVu3Av) z&Bp0BzoFg`W6|yF2+MorGVex>n_$NEL{=CZZRP|61mpsI5jxBXt*nN2yK!SBzR+++ zgBhtoowz|?OUDW|LpvG!7ezxW?~K$or-Q4DyYhtU8XNBjWyD$SXhAycsl(BWLpJJ8 zt!oa6p9oE@Nyk;4YF6G}S6l6HX~q1eh>fe|R+VYNSifTZ_4Q57kus~<+_|CkH#OAQ zixS|sV*O$;{iL70)s?kYh0tAhg{EDUdV9}%LhEm=-FRZWAYY}O%IoqEt`p@7k^iC( z-FQ=Fc*WvHH-Bq+}1A8e?s{ex&N<8wMxWq66w$^5CFi<)m1?ORCQD;!myw!W&l zwrK%ld1n6VSFVJBa^|L~>x~BbEdrTb$w<@SC?+(Jaj~}fG7-1X3g3H0ldF6Rn(301 zrZ5P8qA|pHbUVXeQ)pf7?cmjhk&%PwnQh)wd-_B0L1}sEhr)AUUNlGx0|8 ziO6LgUi8U^a)-H$q$z5{__OZz3|J_98mlwN#x!7;5iWokj8~*_y_hReM<389g4lE6 z7g%ersH3+rb{Py{gvHQCeZIb_HWF=G=UBjtG6?5LaaJr0msXUOE~r>mnJU?-!i8^K za7N*7ylFu=6;N$GLV1I{%fcU8bYn)~vf(4ZYU7AbfQV=h#|UDbfs}6Q#W09 za@u-{i~>3#hP7 zO053Pq02w$kSHXAJ|}eT)aDPSrrA?xT=kIv~|&j1|H!XkhnN@ zo|ZX5*s?+_oX_o-Hp8UYyjRo0S{sIqFC{l$9%cE$*EOy8)0`S~Au*Qx)U=YBq|?%% zR9kbAKJpvxAM`!Zq6I5&udH2b;QRJ~SWw~_wFjG3lsVsognHi8@oNl%Stk2bkQ z^wLo8nEs$MW@IzQpK6Ej8>5Q(fE%N_1~Yi;O+OjdL{|=et!}aG=J>MgjbymZlxnLaLV+f$T2bX=dCQUKYqw$5b%z0bQB|0jLxDWn^$k zGhD)Yb@@<4O$mmEkdR7nm_pVWRu@;&lV4Sb*{VZyor!1ZT4_;iNX%9`8HK%CVO6)< zb&b*6>q5=ztDzyvzoBtseMV%%?Q~p~K=D6t()hIU8N`3T;;)zJZ9{!iL_}tY&~ZqH z%I|$A&2I$)Mx+u~z~gZXMO6JE(N*3nt$ow55eBPKnj7JGYHBysuNona56{|7>m4g2 zC=SOSrERc`QVKuZS_yF@b#%@epozpHjgqMbRJ@bJ(2p$PcScpljWI!N2L6~(yvfbW z;k87b0wF#Kz)X$x5b?gi1zrcb7F}mDTo{ZyXZ)w&CiR?YupbfEpaJzwjq5~1GwP{0 z2Ky1?Kthb@HfO{zoSb=;aAb8uBPh#|Y5cySI6gJCHR<5#u9`v11Go(v;R0{t12P9V zza`6;RxBvH`pOv#{KcOp{PCHu6(9v!P_`)b%n+9Oyd+xNbf<xRZzSKU}^%V?>0lPvK4L$whXWKo)`xYQUgVXl3F zo(tpH7|t&$tytvOYCf18sa@9C*icv7uzuE6OV?GeXHg{(^?HlM2HzN22)@^<)Qco4 zSh%<%0Lq8Ml{bbL!(sS93a49rL9nJ5lxOKp*Dt%Jv@*Or)kw=-BQ1?Yp)1R;o^j>! zrOap7FK59o<5yXGyTSIuwT?OA-QWqJqP5{oHgMo4*b&5elrFfLN~X)@2#Fh%Qj83F zl!h4jScC{QLi05iXenxCEfl0CnB{CVzTcLpf^{wHjs8e~N%I(6-C#}1%|>leg*j=O z_Ykf(SFf&Rc}0Uo{W_LwYB$xcLhdET0zOaEkufaPY4(!p+QUSS84yW7mJKa^Q0R+- z5T)=otD;R>h%!p0AuW&{IF9HP6&~Zu(S7ohsxSnHLY`5DN#djxrUSqJ3RAIQO*2(9 zpN~s5S*rGq--!R9)cXuhzopT2<&Eo>MQd-VtyxwVy}qe_X|<63hU#_K*RCwDZYo{h zR9=1O4bgQsL>o$@w=b<-f77bSjg1=?)UL7wGA@yiGwJmCoMj(1o=wClgImHcV?nvT zd6mhxmC&>(e4G}HE}gb2G(B|XrJ-x*hOT=52ZH3QSFH7=%g#r9Q}V(x?`JqYKXehN zMdI}Qt&7XN4&3N34S|q1{BN2U{0;vy()&VYwx{~r>YeyEG<=Jf{>$>t>@PEgd%g5u zHo6vP@)yJpr2+9j_UXh{t^3c$fUK6(9|rTz=ohr0?)PS;|FW~r>@SFaV(nkA&*^%A zaw_I8$Wd?U=OUR1d>y~x;m@qL=}<*p`q@2YW&MvueZS(X=PcjQeD%zg(RySA%V*8J z`s(EyRxL-Gy|ST3x8==EtCnXDP_HN6h7lqXAAS_}N^8is)UT^)+=y;aYUQ7A5`Z{S zdj`MiMrMnv1<_KQgI6@Jk2)1DrRn@!l2%Gzic;3-*gvna86}9-jW!yuxV<(d$E;p~ z#KIq=6;b15_D9ORe4Ku;CmWg~t5Qk<_Wfgg$JzHfNs(OwdNNrGA2voB5nQLl9A5Q` zRcnJpR;{X=&niab%DHoAYN0iFziRH>D_R+rZ+tp&Dr5%O9C3or0r0ig5B9k9)iC zz0`l7@4ssgsp3@n{@M_r@VDTU{_o+GH)cl6e=YYAPAX%QaN4V&vZ@{mzXhiEeHY&?n5*n)eyseDtFc}zsy&CmmB?!Lg2Rr0-}M!SaOe~SY03%arD82J`@s@&&sH@eJS!9Mag(0uMwxQj*|-Bo6^cMtb>@P0pc z(fSJRA}%5B@8aJ5RGD`^_lLQQhDNvp6YudS%e+n8ALOnbSlhUNockv3I>Ic%T_+#i z#{G1^qm)sHV2IAg^NSveQL9<@bsOZ!Z2veqQE1h&$a+Z4rdYe3qZyFW_E+ zV>^(+>`%D=HSQ4Z7r5~d+?lu=acglwoH=~cn6?oI?s-q(Uc~(zS46lgaOJoL+^K$d zptGkS+NPcvG%GvTQ20?0@3wpIy!RqMkuU4OG=4k3U!P(4Qa}8Yg#U*x9{J+CydQrt@x_mwJpH?OT8t%h*d;%_^@kyE z#Sho~@TwETzu5K9-LHDym3IdvJ0ZwvJ<5UMNKO$S>nQWS`fM6cGGTn$ghvC6LSPgE zqYxN{z$gSpAutMoQ3#Ae;I|9{(?T%p{%_2sIo_d*((i%4?pr43c=zMJi2Ek)+qm!J zdU0c>jeW_cZPRt{c~f%buF!y&ZQk?kd~@+%jAZE`r;F zyC3%u?g`xUxR-JLxU=3vT-*%YLfmb*kK^vgeHHgK?s?o{+$*?#T<#^r!CioxiTfb# zBe*);-M9yEe~H_N`#$bv+)-RV?wo1F!_B}gz%9o$;I`mCi+dRNP23*b_i_J<>&Hz5 zrqgi$nZMDt`t50}`Yd)sYnQYcE%Lnm-u3LWHfun#oL4HTfqY~y$a(yoy*uMXPxIVR zD;xRC8kgRQ8M(E3_PoE%@Lw!z?m;l`tQ;)zWEl0i**_x!3*air{AiQx_oqz#kpFAh z#2CTiTA^0j;X#cm7hU$2*pKdc3$qtvEy_0nMM-bUSr%B) z^7pKJ-W)57t5x9nbu162O`~6yy{H+hwYOkXr?w)}w$QtM?PuCpU74Ll__- z58h8s65|%{lR3B4*VJMVvuRmlxva32VN=$-Y2u-1X!qBFR+(-W31&CV3xM2@lG$_-kg0b)^zMmHk&zZJ!l_$JJu0q`;%;I(u&$9GXaQcPb(Ur`oD^~tbWxUepx@LcfS`cGjnr`YLF~u`1;x4 z-67v}cP?$VI;vxLxm4HIeiZvx85S3iDO#y3YhAeqWMg4|g<;<>&ECTN3Qn?D?3=>n zdcGq&1@mQ%K|^?RvKP-UuU?(myAL<1AX%&O%1M*n!NX_ z#g?XV`^Vn(4bkR0)yA2*q7R>=F!J%O&m$G}TpP)=)cdBv!f;%z4CemzP#;RwARi-h z1{1>MI4W0j(`u#SdGGV)V*{FVPEs{{|4<)NNm)L#Q!qZPG#ALIg3GpA@7H6ewxT*x d=l7xi%rSj5uTcn$LSPgEqYxN{z*`A{{||7n6DI%w literal 0 HcmV?d00001 diff --git a/build/premake/functions.lua b/build/premake/functions.lua new file mode 100755 index 0000000000..26da9fec39 --- /dev/null +++ b/build/premake/functions.lua @@ -0,0 +1,7 @@ +function sourcesfromdirs(root, ...) + local res = {} + for i=1, getn(arg) do + res[i]=matchfiles(root..arg[i].."/*.cpp", root..arg[i].."/*.h") + end + return res +end \ No newline at end of file diff --git a/source/workspaces/premake/premake.exe b/build/premake/premake.exe similarity index 100% rename from source/workspaces/premake/premake.exe rename to build/premake/premake.exe diff --git a/source/workspaces/premake/premake.lua b/build/premake/premake.lua similarity index 71% rename from source/workspaces/premake/premake.lua rename to build/premake/premake.lua index 808a3af68f..44e66143eb 100755 --- a/source/workspaces/premake/premake.lua +++ b/build/premake/premake.lua @@ -1,4 +1,4 @@ -dofile("functions.lua") +dofile("../functions.lua") -- Set up the Project project.name = "pyrogenesis" @@ -19,59 +19,71 @@ package.config["Debug"].target = "ps_dbg" package.config["Release"].target = "ps" package.config["Testing"].target = "ps_test" +sourceroot = "../../../source/" +librariesroot = "../../../libraries/" + -- Files package.files = { - sourcesfromdirs( + sourcesfromdirs(sourceroot, + + "ps", + "ps/scripting", + "ps/Network", - "../../ps", - "../../ps/scripting", - "../../ps/Network", + "simulation", + "simulation/scripting", - "../../simulation", - "../../simulation/scripting", + "lib", + "lib/sysdep", + "lib/res", - "../../lib", - "../../lib/sysdep", - "../../lib/res", + "graphics", + "graphics/scripting", - "../../graphics", - "../../graphics/scripting", + "maths", + "maths/scripting", - "../../maths", - "../../maths/scripting", + "renderer", - "../../renderer", + "gui", + "gui/scripting", - "../../gui", - "../../gui/scripting", + "terrain", - "../../terrain", + "sound", - "../../sound", + "scripting", - "../../scripting", + "i18n", - "../../i18n", - - "../../tests" + "tests" ), - "../../main.cpp" + sourceroot.."main.cpp" } -package.includepaths = { - "../../ps", - "../../simulation", - "../../lib", - "../../graphics", - "../../maths", - "../../renderer", - "../../terrain", - "../.." + +include_dirs = { + "ps", + "simulation", + "lib", + "graphics", + "maths", + "renderer", + "terrain", + "" } +package.includepaths = {} + +foreach(include_dirs, function (i,v) + tinsert(package.includepaths, sourceroot .. v) +end) + + package.libpaths = {} + package.buildflags = { "no-rtti" } package.config["Testing"].buildflags = { "with-symbols", "no-runtime-checks", "no-edit-and-continue" } @@ -96,16 +108,16 @@ if (OS == "windows") then "vorbis" } - -- Add '../../../libraries//lib' and '/include' to the includepaths and libpaths + -- Add '//lib' and '/include' to the includepaths and libpaths foreach(external_libraries, function (i,v) - tinsert(package.includepaths, "../../../libraries/" .. v .. "/include") - tinsert(package.libpaths, "../../../libraries/" .. v .. "/lib") + tinsert(package.includepaths, librariesroot..v.."/include") + tinsert(package.libpaths, librariesroot..v.."/lib") end) -- Libraries package.links = { "opengl32" } - tinsert(package.files, sourcesfromdirs("../../lib/sysdep/win")) - tinsert(package.files, {"../../lib/sysdep/win/assert_dlg.rc"}) + tinsert(package.files, sourcesfromdirs(sourceroot, "lib/sysdep/win")) + tinsert(package.files, {sourceroot.."lib/sysdep/win/assert_dlg.rc"}) package.linkoptions = { "/ENTRY:entry", "/DELAYLOAD:opengl32.dll", @@ -143,7 +155,7 @@ if (OS == "windows") then else -- Non-Windows, = Unix - tinsert(package.files, sourcesfromdirs("../../lib/sysdep/unix")) + tinsert(package.files, sourcesfromdirs(sourceroot.."lib/sysdep/unix")) -- Libraries package.links = { diff --git a/build/premake/src/CHANGES.txt b/build/premake/src/CHANGES.txt new file mode 100644 index 0000000000..232e342519 --- /dev/null +++ b/build/premake/src/CHANGES.txt @@ -0,0 +1,103 @@ +Premake Changelog +----------------- + +1.9 +* Made verbose mode even more verbose. +* posix.c now builds properly as C. +* Fixed package dependency generation for GNU and VS2003. +* Display Lua version number in usage text. +* Fixed VS link between *.aspx and *.aspx.cs files. +* Fixed VS link between *.resx and *.cs files. +* Fixed *.d file generation for gcc 2.9x. +* Unified various help options under '--help'. +* Bin and Lib paths can now be arbitrarily long. +* linkoptions are now applied in VC6 and VC7 projects. + +1.8 +* Added support for ASP.NET projects. +* Fixed a bug in VC6 support for static libraries. +* matchfiles() now uses package path instead of script path. +* Added --verbose option. +* No longer apply no-rtti and no-exceptions to *.c files. + +1.7 +* Location of generated project files can now be specified with + the project.path variable. +* Inter-package dependencies are fixed for GNU makefiles. +* No longer need to execute in same directory as project script. +* Added "c" language specifier. +* Added support for .resx and .config files to C# projects. +* Added support for full assembly names in .NET references. +* Fixed handling of paths in package.target variable. +* Improved support for SharpDevelop. +* Started support for OS X. +* Added support for Digital Mars compiler. + +1.6.1 +* VS7 generator crashed if a package was built before one of its + dependencies. Now immediately assigns UUID before processing. + +1.6 +* Added support for Visual Studio 2003 and SharpDevelop. +* Added binaries directory as a reference path for VS7. + +1.5 +* Added initial support for building static libraries. +* Added "no-main" flag, prevents overriding WinMain() on + Windows builds. +* Added "--no-rtti" and "no-exceptions" build flags to + disable those C++ features. +* Display error message when project has no packages. +* Moved VC7 *.pdb files into intermediates directory. + +1.4 +* Bug fixes to the path manipulation routines. +* GNU makefiles are regenerated when premake scripts change. + +1.3 +* Added support for the Cygwin environment. +* Added "static-runtime" build flag to statically link against C/C++ + standard runtime libraries. +* Bug fixes to Visual Studio 6 and 7 generators and path reversing + algorithm. + +1.2 +* Standardized format of command-line options. +* Can now handle custom command-line options in script. +* Added new function findlib(). +* Added new C++ build flag "managed" for writing C++ .NET code. +* Can now use open-source C# compilers in VS6 generator. +* Several bug fixes to the VS7 generator. + +1.1 +* Added support for custom build configurations. Added "optimize", + "optimize-size", "optimize-speed", and "no-symbols" flags to control + build settings. +* Added matchfiles() to select files using wildcards. +* Added "unsafe" flag for C# projects. +* Added newpackage() function for creating new package objects inline, + instead of creating separate scripts. +* Changed include() to dopackage() and option() to addoption(). The old + versions have been kept for compatibility, but will be deprecated + eventually. +* Major cleanup of the source code. + +1.0 +* Fixed a bug related to the reference paths in VS7 C# projects. +* Display a warning message if a reference path can't be found. +* Automatically create bin and lib directories if they do not exist. +* GNU C# projects will now properly use the configured library paths. + +0.9.2 +* Added --with-mono and --with-pnet options. +* VS7 C# projects will now properly use the configured library paths. + +0.9.1 +* Switched to Lua (http://www.lua.org/) for project script parsing. +* Add support for custom project options. +* Changed 'type' to 'kind' to avoid conflict with Lua function of the same name. +* Changed 'conexe' to 'exe' because I liked it better. +* Changed 'library' to 'dll' for C# projects to keep things consistent. + +0.9.0 +* Initial public release. diff --git a/build/premake/src/LICENSE.txt b/build/premake/src/LICENSE.txt new file mode 100644 index 0000000000..5b6e7c66c2 --- /dev/null +++ b/build/premake/src/LICENSE.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/build/premake/src/Makefile b/build/premake/src/Makefile new file mode 100644 index 0000000000..91aa71865b --- /dev/null +++ b/build/premake/src/Makefile @@ -0,0 +1,24 @@ +# Makefile autogenerated by premake +# Options: +# CONFIG=[Debug|Release] + +ifndef CONFIG + CONFIG=Debug +endif + +export CONFIG + +.PHONY: all clean Premake + +all: Premake + +Makefile: ./premake.lua + @echo ==== Regenerating Makefiles ==== + @premake --target gnu + +Premake: + @echo ==== Building Premake ==== + @$(MAKE) --no-print-directory -C ./ -f Premake.make + +clean: + @$(MAKE) --no-print-directory -C ./ -f Premake.make clean diff --git a/build/premake/src/Premake.dsp b/build/premake/src/Premake.dsp new file mode 100644 index 0000000000..92be5d2ad7 --- /dev/null +++ b/build/premake/src/Premake.dsp @@ -0,0 +1,325 @@ +# Microsoft Developer Studio Project File - Name="Premake" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Premake - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Premake.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Premake.mak" CFG="Premake - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Premake - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "Premake - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Premake - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug\" +# PROP BASE Intermediate_Dir "Debug\" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir ".\" +# PROP Intermediate_Dir "obj\Debug\" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /ZI /Od /GX /GR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /debug /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /out:".\premake.exe" /machine:I386 /pdbtype:sept /libpath:".\" /pdb:".\premake.pdb" /debug +!ELSEIF "$(CFG)" == "Premake - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release\" +# PROP BASE Intermediate_Dir "Release\" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir ".\" +# PROP Intermediate_Dir "obj\Release\" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /GR /O1 /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /out:".\premake.exe" /machine:I386 /pdbtype:sept /libpath:".\" +!ENDIF + +# Begin Target + +# Name "Premake - Win32 Debug" +# Name "Premake - Win32 Release" +# Begin Group "Src" + +# PROP Default_Filter "" +# Begin Group "Lua" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\Src\Lua\lapi.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lauxlib.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lbaselib.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lcode.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\ldebug.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\ldo.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lfunc.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lgc.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\liolib.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\llex.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lmathlib.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lmem.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lobject.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lparser.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lstate.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lstring.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lstrlib.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\ltable.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\ltests.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\ltm.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lundump.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lvm.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lzio.c +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lapi.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lauxlib.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lcode.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\ldebug.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\ldo.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lfunc.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lgc.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\llex.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\llimits.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lmem.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lobject.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lopcodes.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lparser.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lstate.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lstring.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\ltable.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\ltm.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lua.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\luadebug.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lualib.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lundump.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lvm.h +# End Source File +# Begin Source File + +SOURCE=.\Src\Lua\lzio.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\Src\premake.c +# End Source File +# Begin Source File + +SOURCE=.\Src\project.h +# End Source File +# Begin Source File + +SOURCE=.\Src\project.c +# End Source File +# Begin Source File + +SOURCE=.\Src\util.h +# End Source File +# Begin Source File + +SOURCE=.\Src\util.c +# End Source File +# Begin Source File + +SOURCE=.\Src\clean.c +# End Source File +# Begin Source File + +SOURCE=.\Src\gnu.c +# End Source File +# Begin Source File + +SOURCE=.\Src\sharpdev.c +# End Source File +# Begin Source File + +SOURCE=.\Src\vs7.c +# End Source File +# Begin Source File + +SOURCE=.\Src\vs6.c +# End Source File +# Begin Source File + +SOURCE=.\Src\windows.c +# End Source File +# End Group +# End Target +# End Project diff --git a/build/premake/src/Premake.dsw b/build/premake/src/Premake.dsw new file mode 100644 index 0000000000..62663c6e50 --- /dev/null +++ b/build/premake/src/Premake.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Premake"=.\Premake.dsp + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/build/premake/src/Premake.make b/build/premake/src/Premake.make new file mode 100644 index 0000000000..bc5fab873e --- /dev/null +++ b/build/premake/src/Premake.make @@ -0,0 +1,112 @@ +# Sub-makefile autogenerated by premake + +BINDIR = . +LIBDIR = . + +CFLAGS = +LDFLAGS = -L$(BINDIR) -L$(LIBDIR) +TARGET = + +ifeq ($(CONFIG),Debug) + CFLAGS += + CXXFLAGS = $(CFLAGS) + LDFLAGS += + TARGET = premake +endif +ifeq ($(CONFIG),Release) + CFLAGS += -Os + CXXFLAGS = $(CFLAGS) -Os + LDFLAGS += + TARGET = premake +endif + +obj/%.o : %.cc + -@if [ ! -d obj ]; then mkdir obj; fi + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -MD -o $@ -c $< + -@if [ -f $*.d ]; then mv $*.d obj/$*.d; fi + @cp obj/$*.d obj/$*.P; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < obj/$*.d >> obj/$*.P; \ + rm -f obj/$*.d + +obj/%.o : %.cpp + -@if [ ! -d obj ]; then mkdir obj; fi + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -MD -o $@ -c $< + -@if [ -f $*.d ]; then mv $*.d obj/$*.d; fi + @cp obj/$*.d obj/$*.P; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < obj/$*.d >> obj/$*.P; \ + rm -f obj/$*.d + +obj/%.o : %.cxx + -@if [ ! -d obj ]; then mkdir obj; fi + @echo $(notdir $<) + @$(CXX) $(CXXFLAGS) -MD -o $@ -c $< + -@if [ -f $*.d ]; then mv $*.d obj/$*.d; fi + @cp obj/$*.d obj/$*.P; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < obj/$*.d >> obj/$*.P; \ + rm -f obj/$*.d + +obj/%.o : %.c + -@if [ ! -d obj ]; then mkdir obj; fi + @echo $(notdir $<) + @$(CC) $(CFLAGS) -MD -o $@ -c $< + -@if [ -f $*.d ]; then mv $*.d obj/$*.d; fi + @cp obj/$*.d obj/$*.P; \ + sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < obj/$*.d >> obj/$*.P; \ + rm -f obj/$*.d + +OBJECTS = \ + obj/premake.o \ + obj/project.o \ + obj/util.o \ + obj/clean.o \ + obj/gnu.o \ + obj/sharpdev.o \ + obj/vs7.o \ + obj/vs6.o \ + obj/lapi.o \ + obj/lauxlib.o \ + obj/lbaselib.o \ + obj/lcode.o \ + obj/ldebug.o \ + obj/ldo.o \ + obj/lfunc.o \ + obj/lgc.o \ + obj/liolib.o \ + obj/llex.o \ + obj/lmathlib.o \ + obj/lmem.o \ + obj/lobject.o \ + obj/lparser.o \ + obj/lstate.o \ + obj/lstring.o \ + obj/lstrlib.o \ + obj/ltable.o \ + obj/ltests.o \ + obj/ltm.o \ + obj/lundump.o \ + obj/lvm.o \ + obj/lzio.o \ + obj/posix.o \ + +VPATH = Src Src/Lua + +.PHONY: clean + +$(BINDIR)/$(TARGET): $(OBJECTS) + @echo Linking Premake + -@if [ ! -d $(BINDIR) ]; then mkdir $(BINDIR); fi + -@if [ ! -d $(LIBDIR) ]; then mkdir $(LIBDIR); fi + @$(CXX) -o $@ $(filter-out %.so, $^) $(LDFLAGS) + +clean: + @echo Cleaning Premake + -@rm -rf $(BINDIR)/$(TARGET) obj/* + +-include $(OBJECTS:%.o=%.P) + diff --git a/build/premake/src/Premake.sln b/build/premake/src/Premake.sln new file mode 100644 index 0000000000..1059c874a0 --- /dev/null +++ b/build/premake/src/Premake.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Premake", "Premake.vcproj", "{D240CFA2-A134-D147-8EF3-30B485E4E25F}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {D240CFA2-A134-D147-8EF3-30B485E4E25F}.Debug.ActiveCfg = Debug|Win32 + {D240CFA2-A134-D147-8EF3-30B485E4E25F}.Debug.Build.0 = Debug|Win32 + {D240CFA2-A134-D147-8EF3-30B485E4E25F}.Release.ActiveCfg = Release|Win32 + {D240CFA2-A134-D147-8EF3-30B485E4E25F}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/build/premake/src/Premake.vcproj b/build/premake/src/Premake.vcproj new file mode 100644 index 0000000000..e6da3a8e88 --- /dev/null +++ b/build/premake/src/Premake.vcproj @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/premake/src/README.txt b/build/premake/src/README.txt new file mode 100644 index 0000000000..718d495ae4 --- /dev/null +++ b/build/premake/src/README.txt @@ -0,0 +1,20 @@ +PREMAKE v1.8 + +Copyright (C) 2002-2004 by Jason Perkins +Distributed under the GNU General Public License, see LICENSE.txt + +The Lua language and runtime library is (C) TeCGraf, PUC-Rio. +See their website at http://www.lua.org/ + + +BUILDING PREMAKE + + GNU make: type 'make' + + MS Visual C++ v6: open Premake.dsw and build. + + MS Visual C++ v7: open Premake.sln and build. + + +For questions, comments, or more information, visit the project +website at http://premake.sourceforge.net/ diff --git a/build/premake/src/Src/Lua/COPYRIGHT b/build/premake/src/Src/Lua/COPYRIGHT new file mode 100644 index 0000000000..eef88b050c --- /dev/null +++ b/build/premake/src/Src/Lua/COPYRIGHT @@ -0,0 +1,54 @@ +Lua Copyright Notice +-------------------- + +Lua is free and non-proprietary. +It can be used for both academic and commercial purposes at absolutely no cost. +There are no royalties or GNU-like "copyleft" restrictions. +Lua (probably) qualifies as Open Source software. +Nevertheless, Lua is not in the public domain and TeCGraf keeps its copyright. + +If you use Lua, please give us credit (a nice way to do this is to include a +Lua logo in a web page for your product), but we would appreciate *not* +receiving lengthy legal documents to sign. + +The legal details are below. + +=============================================================================== + +Copyright (C) 1994-2000 TeCGraf, PUC-Rio. All rights reserved. + +Permission is hereby granted, without written agreement and without license +or royalty fees, to use, copy, modify, translate, and distribute +this software and its documentation (hereby called the "package") +for any purpose, including commercial applications, subject to +the following conditions: + + * The above copyright notice and this permission notice shall appear in all + copies or substantial portions of this package. + + * The origin of this package must not be misrepresented; you must not + claim that you wrote the original package. If you use this package in a + product, an acknowledgment in the product documentation would be greatly + appreciated (but it is not required). + + * Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original package. + +The authors specifically disclaim any warranties, including, but not limited +to, the implied warranties of merchantability and fitness for a particular +purpose. The package provided hereunder is on an "as is" basis, and the +authors have no obligation to provide maintenance, support, updates, +enhancements, or modifications. In no event shall TeCGraf, PUC-Rio, or the +authors be held liable to any party for direct, indirect, special, +incidental, or consequential damages arising out of the use of this package +and its documentation. + +The Lua language and this implementation have been entirely designed and written +by Waldemar Celes, Roberto Ierusalimschy, and Luiz Henrique de Figueiredo +at TeCGraf, PUC-Rio in Brazil. + +This implementation contains no third-party code. + +=============================================================================== + +(end of COPYRIGHT) diff --git a/build/premake/src/Src/Lua/README b/build/premake/src/Src/Lua/README new file mode 100644 index 0000000000..81f767aee8 --- /dev/null +++ b/build/premake/src/Src/Lua/README @@ -0,0 +1,72 @@ +This is Lua 4.0. +See HISTORY for a summary of changes since the last version. + +* What is Lua? + ------------ + Lua is a powerful, light-weight programming language designed for extending + applications. Lua is also frequently used as a general-purpose, stand-alone + language. + + Lua combines simple procedural syntax (similar to Pascal) with powerful + data description constructs based on associative arrays and extensible + semantics. Lua is dynamically typed, interpreted from bytecodes, and has + automatic memory management, making it ideal for configuration, scripting, + and rapid prototyping. + + Lua is a language engine that you can embed into your application. + This means that, besides syntax and semantics, Lua has an API that + allows the application to exchange data with Lua programs and also to + extend Lua with C functions. In this sense, Lua can be regarded as a + language framework for building domain-specific languages. + + Lua is implemented as a small library of C functions, written in ANSI C, + and compiles unmodified in all known platforms. The implementation goals + are simplicity, efficiency, portability, and low embedding cost. + The result is a fast language engine with small footprint, making it + ideal in embedded systems too. + + Lua was awarded the first prize (technological category) in the + Second Compaq Award for Research and Development in Computer Science in 1997. + This award was a joint venture of Compaq Computer in Brazil, the Brazilian + Ministry of Science and Technology, and the Brazilian Academy of Sciences. + + Lua has been used in many different projects around the world. + For a short list, see http://www.tecgraf.puc-rio.br/lua/uses.html . + +* Availability + ------------ + Lua is freely available for both academic and commercial purposes and + can be downloaded from the sites below. See COPYRIGHT for details. + + Home page: http://www.tecgraf.puc-rio.br/lua/ + http://csg.uwaterloo.ca/~lhf/lua/ + In Brazil: ftp://ftp.tecgraf.puc-rio.br/pub/lua/ + In Canada: ftp://csg.uwaterloo.ca/pub/lhf/lua/ + In the US: ftp://ftp.freesoftware.com/pub/languages/lua/ + In Germany: ftp://ftp.uni-trier.de/pub/languages/lua/ + In Germany: ftp://ftp.gwdg.de/pub/languages/lua/ + In Greece: ftp://ftp.ntua.gr/pub/lang/lua/ + In Japan: ftp://ftp.u-aizu.ac.jp/pub/lang/lua/ + In Denmark: ftp://ftp.ucore.com/lua/dist + +* Installation + ------------ + See INSTALL. + +* Contacting the authors + ---------------------- + Lua was designed and implemented by Waldemar Celes, Roberto Ierusalimschy + and Luiz Henrique de Figueiredo. + They can be contacted by email at lua@tecgraf.puc-rio.br. + + Send your comments, questions, and bug reports to lua@tecgraf.puc-rio.br. + For reporting bugs, try also the mailing list: lua-l@tecgraf.puc-rio.br. + For more information about this list, including instructions on how to + subscribe, see http://www.tecgraf.puc-rio.br/lua/lua-l.html . + + Lua is developed at TeCGraf, the Computer Graphics Technology Group + of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro in Brazil). + TeCGraf is a laboratory of the Department of Computer Science. + Dozens of industrial products developed by TeCGraf use Lua. + +(end of README) diff --git a/build/premake/src/Src/Lua/lapi.c b/build/premake/src/Src/Lua/lapi.c new file mode 100644 index 0000000000..ffda86ed7f --- /dev/null +++ b/build/premake/src/Src/Lua/lapi.c @@ -0,0 +1,494 @@ +/* +** $Id: lapi.c,v 1.1 2003/01/24 16:25:58 jason379 Exp $ +** Lua API +** See Copyright Notice in lua.h +*/ + + +#include + +#include "lua.h" + +#include "lapi.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + +const char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n" + "$Authors: " LUA_AUTHORS " $"; + + + +#define Index(L,i) ((i) >= 0 ? (L->Cbase+((i)-1)) : (L->top+(i))) + +#define api_incr_top(L) incr_top + + + + +TObject *luaA_index (lua_State *L, int index) { + return Index(L, index); +} + + +static TObject *luaA_indexAcceptable (lua_State *L, int index) { + if (index >= 0) { + TObject *o = L->Cbase+(index-1); + if (o >= L->top) return NULL; + else return o; + } + else return L->top+index; +} + + +void luaA_pushobject (lua_State *L, const TObject *o) { + *L->top = *o; + incr_top; +} + +LUA_API int lua_stackspace (lua_State *L) { + return (L->stack_last - L->top); +} + + + +/* +** basic stack manipulation +*/ + + +LUA_API int lua_gettop (lua_State *L) { + return (L->top - L->Cbase); +} + + +LUA_API void lua_settop (lua_State *L, int index) { + if (index >= 0) + luaD_adjusttop(L, L->Cbase, index); + else + L->top = L->top+index+1; /* index is negative */ +} + + +LUA_API void lua_remove (lua_State *L, int index) { + StkId p = luaA_index(L, index); + while (++p < L->top) *(p-1) = *p; + L->top--; +} + + +LUA_API void lua_insert (lua_State *L, int index) { + StkId p = luaA_index(L, index); + StkId q; + for (q = L->top; q>p; q--) + *q = *(q-1); + *p = *L->top; +} + + +LUA_API void lua_pushvalue (lua_State *L, int index) { + *L->top = *luaA_index(L, index); + api_incr_top(L); +} + + + +/* +** access functions (stack -> C) +*/ + + +LUA_API int lua_type (lua_State *L, int index) { + StkId o = luaA_indexAcceptable(L, index); + return (o == NULL) ? LUA_TNONE : ttype(o); +} + +LUA_API const char *lua_typename (lua_State *L, int t) { + UNUSED(L); + return (t == LUA_TNONE) ? "no value" : luaO_typenames[t]; +} + + +LUA_API int lua_iscfunction (lua_State *L, int index) { + StkId o = luaA_indexAcceptable(L, index); + return (o == NULL) ? 0 : iscfunction(o); +} + +LUA_API int lua_isnumber (lua_State *L, int index) { + TObject *o = luaA_indexAcceptable(L, index); + return (o == NULL) ? 0 : (tonumber(o) == 0); +} + +LUA_API int lua_isstring (lua_State *L, int index) { + int t = lua_type(L, index); + return (t == LUA_TSTRING || t == LUA_TNUMBER); +} + + +LUA_API int lua_tag (lua_State *L, int index) { + StkId o = luaA_indexAcceptable(L, index); + return (o == NULL) ? LUA_NOTAG : luaT_tag(o); +} + +LUA_API int lua_equal (lua_State *L, int index1, int index2) { + StkId o1 = luaA_indexAcceptable(L, index1); + StkId o2 = luaA_indexAcceptable(L, index2); + if (o1 == NULL || o2 == NULL) return 0; /* index out-of-range */ + else return luaO_equalObj(o1, o2); +} + +LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { + StkId o1 = luaA_indexAcceptable(L, index1); + StkId o2 = luaA_indexAcceptable(L, index2); + if (o1 == NULL || o2 == NULL) return 0; /* index out-of-range */ + else return luaV_lessthan(L, o1, o2, L->top); +} + + + +LUA_API double lua_tonumber (lua_State *L, int index) { + StkId o = luaA_indexAcceptable(L, index); + return (o == NULL || tonumber(o)) ? 0 : nvalue(o); +} + +LUA_API const char *lua_tostring (lua_State *L, int index) { + StkId o = luaA_indexAcceptable(L, index); + return (o == NULL || tostring(L, o)) ? NULL : svalue(o); +} + +LUA_API size_t lua_strlen (lua_State *L, int index) { + StkId o = luaA_indexAcceptable(L, index); + return (o == NULL || tostring(L, o)) ? 0 : tsvalue(o)->len; +} + +LUA_API lua_CFunction lua_tocfunction (lua_State *L, int index) { + StkId o = luaA_indexAcceptable(L, index); + return (o == NULL || !iscfunction(o)) ? NULL : clvalue(o)->f.c; +} + +LUA_API void *lua_touserdata (lua_State *L, int index) { + StkId o = luaA_indexAcceptable(L, index); + return (o == NULL || ttype(o) != LUA_TUSERDATA) ? NULL : + tsvalue(o)->u.d.value; +} + +LUA_API const void *lua_topointer (lua_State *L, int index) { + StkId o = luaA_indexAcceptable(L, index); + if (o == NULL) return NULL; + switch (ttype(o)) { + case LUA_TTABLE: + return hvalue(o); + case LUA_TFUNCTION: + return clvalue(o); + default: return NULL; + } +} + + + +/* +** push functions (C -> stack) +*/ + + +LUA_API void lua_pushnil (lua_State *L) { + ttype(L->top) = LUA_TNIL; + api_incr_top(L); +} + + +LUA_API void lua_pushnumber (lua_State *L, double n) { + nvalue(L->top) = n; + ttype(L->top) = LUA_TNUMBER; + api_incr_top(L); +} + + +LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { + tsvalue(L->top) = luaS_newlstr(L, s, len); + ttype(L->top) = LUA_TSTRING; + api_incr_top(L); +} + + +LUA_API void lua_pushstring (lua_State *L, const char *s) { + if (s == NULL) + lua_pushnil(L); + else + lua_pushlstring(L, s, strlen(s)); +} + + +LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { + luaV_Cclosure(L, fn, n); +} + + +LUA_API void lua_pushusertag (lua_State *L, void *u, int tag) { + /* ORDER LUA_T */ + if (!(tag == LUA_ANYTAG || tag == LUA_TUSERDATA || validtag(tag))) + luaO_verror(L, "invalid tag for a userdata (%d)", tag); + tsvalue(L->top) = luaS_createudata(L, u, tag); + ttype(L->top) = LUA_TUSERDATA; + api_incr_top(L); +} + + + +/* +** get functions (Lua -> stack) +*/ + + +LUA_API void lua_getglobal (lua_State *L, const char *name) { + StkId top = L->top; + *top = *luaV_getglobal(L, luaS_new(L, name)); + L->top = top; + api_incr_top(L); +} + + +LUA_API void lua_gettable (lua_State *L, int index) { + StkId t = Index(L, index); + StkId top = L->top; + *(top-1) = *luaV_gettable(L, t); + L->top = top; /* tag method may change top */ +} + + +LUA_API void lua_rawget (lua_State *L, int index) { + StkId t = Index(L, index); + LUA_ASSERT(ttype(t) == LUA_TTABLE, "table expected"); + *(L->top - 1) = *luaH_get(L, hvalue(t), L->top - 1); +} + + +LUA_API void lua_rawgeti (lua_State *L, int index, int n) { + StkId o = Index(L, index); + LUA_ASSERT(ttype(o) == LUA_TTABLE, "table expected"); + *L->top = *luaH_getnum(hvalue(o), n); + api_incr_top(L); +} + + +LUA_API void lua_getglobals (lua_State *L) { + hvalue(L->top) = L->gt; + ttype(L->top) = LUA_TTABLE; + api_incr_top(L); +} + + +LUA_API int lua_getref (lua_State *L, int ref) { + if (ref == LUA_REFNIL) + ttype(L->top) = LUA_TNIL; + else if (0 <= ref && ref < L->refSize && + (L->refArray[ref].st == LOCK || L->refArray[ref].st == HOLD)) + *L->top = L->refArray[ref].o; + else + return 0; + api_incr_top(L); + return 1; +} + + +LUA_API void lua_newtable (lua_State *L) { + hvalue(L->top) = luaH_new(L, 0); + ttype(L->top) = LUA_TTABLE; + api_incr_top(L); +} + + + +/* +** set functions (stack -> Lua) +*/ + + +LUA_API void lua_setglobal (lua_State *L, const char *name) { + StkId top = L->top; + luaV_setglobal(L, luaS_new(L, name)); + L->top = top-1; /* remove element from the top */ +} + + +LUA_API void lua_settable (lua_State *L, int index) { + StkId t = Index(L, index); + StkId top = L->top; + luaV_settable(L, t, top-2); + L->top = top-2; /* pop index and value */ +} + + +LUA_API void lua_rawset (lua_State *L, int index) { + StkId t = Index(L, index); + LUA_ASSERT(ttype(t) == LUA_TTABLE, "table expected"); + *luaH_set(L, hvalue(t), L->top-2) = *(L->top-1); + L->top -= 2; +} + + +LUA_API void lua_rawseti (lua_State *L, int index, int n) { + StkId o = Index(L, index); + LUA_ASSERT(ttype(o) == LUA_TTABLE, "table expected"); + *luaH_setint(L, hvalue(o), n) = *(L->top-1); + L->top--; +} + + +LUA_API void lua_setglobals (lua_State *L) { + StkId newtable = --L->top; + LUA_ASSERT(ttype(newtable) == LUA_TTABLE, "table expected"); + L->gt = hvalue(newtable); +} + + +LUA_API int lua_ref (lua_State *L, int lock) { + int ref; + if (ttype(L->top-1) == LUA_TNIL) + ref = LUA_REFNIL; + else { + if (L->refFree != NONEXT) { /* is there a free place? */ + ref = L->refFree; + L->refFree = L->refArray[ref].st; + } + else { /* no more free places */ + luaM_growvector(L, L->refArray, L->refSize, 1, struct Ref, + "reference table overflow", MAX_INT); + L->nblocks += sizeof(struct Ref); + ref = L->refSize++; + } + L->refArray[ref].o = *(L->top-1); + L->refArray[ref].st = lock ? LOCK : HOLD; + } + L->top--; + return ref; +} + + +/* +** "do" functions (run Lua code) +** (most of them are in ldo.c) +*/ + +LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults) { + luaD_call(L, L->top-(nargs+1), nresults); +} + + +/* +** Garbage-collection functions +*/ + +/* GC values are expressed in Kbytes: #bytes/2^10 */ +#define GCscale(x) ((int)((x)>>10)) +#define GCunscale(x) ((unsigned long)(x)<<10) + +LUA_API int lua_getgcthreshold (lua_State *L) { + return GCscale(L->GCthreshold); +} + +LUA_API int lua_getgccount (lua_State *L) { + return GCscale(L->nblocks); +} + +LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) { + if (newthreshold > GCscale(ULONG_MAX)) + L->GCthreshold = ULONG_MAX; + else + L->GCthreshold = GCunscale(newthreshold); + luaC_checkGC(L); +} + + +/* +** miscellaneous functions +*/ + +LUA_API void lua_settag (lua_State *L, int tag) { + luaT_realtag(L, tag); + switch (ttype(L->top-1)) { + case LUA_TTABLE: + hvalue(L->top-1)->htag = tag; + break; + case LUA_TUSERDATA: + tsvalue(L->top-1)->u.d.tag = tag; + break; + default: + luaO_verror(L, "cannot change the tag of a %.20s", + luaO_typename(L->top-1)); + } +} + + +LUA_API void lua_unref (lua_State *L, int ref) { + if (ref >= 0) { + LUA_ASSERT(ref < L->refSize && L->refArray[ref].st < 0, "invalid ref"); + L->refArray[ref].st = L->refFree; + L->refFree = ref; + } +} + + +LUA_API int lua_next (lua_State *L, int index) { + StkId t = luaA_index(L, index); + Node *n; + LUA_ASSERT(ttype(t) == LUA_TTABLE, "table expected"); + n = luaH_next(L, hvalue(t), luaA_index(L, -1)); + if (n) { + *(L->top-1) = *key(n); + *L->top = *val(n); + api_incr_top(L); + return 1; + } + else { /* no more elements */ + L->top -= 1; /* remove key */ + return 0; + } +} + + +LUA_API int lua_getn (lua_State *L, int index) { + Hash *h = hvalue(luaA_index(L, index)); + const TObject *value = luaH_getstr(h, luaS_new(L, "n")); /* value = h.n */ + if (ttype(value) == LUA_TNUMBER) + return (int)nvalue(value); + else { + Number max = 0; + int i = h->size; + Node *n = h->node; + while (i--) { + if (ttype(key(n)) == LUA_TNUMBER && + ttype(val(n)) != LUA_TNIL && + nvalue(key(n)) > max) + max = nvalue(key(n)); + n++; + } + return (int)max; + } +} + + +LUA_API void lua_concat (lua_State *L, int n) { + StkId top = L->top; + luaV_strconc(L, n, top); + L->top = top-(n-1); + luaC_checkGC(L); +} + + +LUA_API void *lua_newuserdata (lua_State *L, size_t size) { + TString *ts = luaS_newudata(L, (size==0) ? 1 : size, NULL); + tsvalue(L->top) = ts; + ttype(L->top) = LUA_TUSERDATA; + api_incr_top(L); + return ts->u.d.value; +} + diff --git a/build/premake/src/Src/Lua/lapi.h b/build/premake/src/Src/Lua/lapi.h new file mode 100644 index 0000000000..fab2278615 --- /dev/null +++ b/build/premake/src/Src/Lua/lapi.h @@ -0,0 +1,17 @@ +/* +** $Id: lapi.h,v 1.1 2003/01/24 16:25:58 jason379 Exp $ +** Auxiliary functions from Lua API +** See Copyright Notice in lua.h +*/ + +#ifndef lapi_h +#define lapi_h + + +#include "lobject.h" + + +TObject *luaA_index (lua_State *L, int index); +void luaA_pushobject (lua_State *L, const TObject *o); + +#endif diff --git a/build/premake/src/Src/Lua/lauxlib.c b/build/premake/src/Src/Lua/lauxlib.c new file mode 100644 index 0000000000..8076230213 --- /dev/null +++ b/build/premake/src/Src/Lua/lauxlib.c @@ -0,0 +1,216 @@ +/* +** $Id: lauxlib.c,v 1.2 2003/04/23 12:16:05 jason379 Exp $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +/* This file uses only the official API of Lua. +** Any function declared here could be written as an application function. +** With care, these functions can be used by other libraries. +*/ + +#include "lua.h" + +#include "lauxlib.h" +#include "luadebug.h" + + + +LUALIB_API int luaL_findstring (const char *name, const char *const list[]) { + int i; + for (i=0; list[i]; i++) + if (strcmp(list[i], name) == 0) + return i; + return -1; /* name not found */ +} + +LUALIB_API void luaL_argerror (lua_State *L, int narg, const char *extramsg) { + lua_Debug ar; + lua_getstack(L, 0, &ar); + lua_getinfo(L, "n", &ar); + if (ar.name == NULL) + ar.name = "?"; + luaL_verror(L, "bad argument #%d to `%.50s' (%.100s)", + narg, ar.name, extramsg); +} + + +static void type_error (lua_State *L, int narg, int t) { + char buff[50]; + sprintf(buff, "%.8s expected, got %.8s", lua_typename(L, t), + lua_typename(L, lua_type(L, narg))); + luaL_argerror(L, narg, buff); +} + + +LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) { + if (space > lua_stackspace(L)) + luaL_verror(L, "stack overflow (%.30s)", mes); +} + + +LUALIB_API void luaL_checktype(lua_State *L, int narg, int t) { + if (lua_type(L, narg) != t) + type_error(L, narg, t); +} + + +LUALIB_API void luaL_checkany (lua_State *L, int narg) { + if (lua_type(L, narg) == LUA_TNONE) + luaL_argerror(L, narg, "value expected"); +} + + +LUALIB_API const char *luaL_check_lstr (lua_State *L, int narg, size_t *len) { + const char *s = lua_tostring(L, narg); + if (!s) type_error(L, narg, LUA_TSTRING); + if (len) *len = lua_strlen(L, narg); + return s; +} + + +LUALIB_API const char *luaL_opt_lstr (lua_State *L, int narg, const char *def, size_t *len) { + if (lua_isnull(L, narg)) { + if (len) + *len = (def ? strlen(def) : 0); + return def; + } + else return luaL_check_lstr(L, narg, len); +} + + +LUALIB_API double luaL_check_number (lua_State *L, int narg) { + double d = lua_tonumber(L, narg); + if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ + type_error(L, narg, LUA_TNUMBER); + return d; +} + + +LUALIB_API double luaL_opt_number (lua_State *L, int narg, double def) { + if (lua_isnull(L, narg)) return def; + else return luaL_check_number(L, narg); +} + + +LUALIB_API void luaL_openlib (lua_State *L, const struct luaL_reg *l, int n) { + int i; + for (i=0; ip == (B)->buffer) +#define bufflen(B) ((B)->p - (B)->buffer) +#define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B))) + +#define LIMIT (LUA_MINSTACK/2) + + +static int emptybuffer (luaL_Buffer *B) { + size_t l = bufflen(B); + if (l == 0) return 0; /* put nothing on stack */ + else { + lua_pushlstring(B->L, B->buffer, l); + B->p = B->buffer; + B->level++; + return 1; + } +} + + +static void adjuststack (luaL_Buffer *B) { + if (B->level > 1) { + lua_State *L = B->L; + int toget = 1; /* number of levels to concat */ + size_t toplen = lua_strlen(L, -1); + do { + size_t l = lua_strlen(L, -(toget+1)); + if (B->level - toget + 1 >= LIMIT || toplen > l) { + toplen += l; + toget++; + } + else break; + } while (toget < B->level); + if (toget >= 2) { + lua_concat(L, toget); + B->level = B->level - toget + 1; + } + } +} + + +LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) { + if (emptybuffer(B)) + adjuststack(B); + return B->buffer; +} + + +LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { + while (l--) + luaL_putchar(B, *s++); +} + + +LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { + luaL_addlstring(B, s, strlen(s)); +} + + +LUALIB_API void luaL_pushresult (luaL_Buffer *B) { + emptybuffer(B); + if (B->level == 0) + lua_pushlstring(B->L, NULL, 0); + else if (B->level > 1) + lua_concat(B->L, B->level); + B->level = 1; +} + + +LUALIB_API void luaL_addvalue (luaL_Buffer *B) { + lua_State *L = B->L; + size_t vl = lua_strlen(L, -1); + if (vl <= bufffree(B)) { /* fit into buffer? */ + memcpy(B->p, lua_tostring(L, -1), vl); /* put it there */ + B->p += vl; + lua_pop(L, 1); /* remove from stack */ + } + else { + if (emptybuffer(B)) + lua_insert(L, -2); /* put buffer before new value */ + B->level++; /* add new value into B stack */ + adjuststack(B); + } +} + + +LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { + B->L = L; + B->p = B->buffer; + B->level = 0; +} + +/* }====================================================== */ diff --git a/build/premake/src/Src/Lua/lauxlib.h b/build/premake/src/Src/Lua/lauxlib.h new file mode 100644 index 0000000000..d87b209c48 --- /dev/null +++ b/build/premake/src/Src/Lua/lauxlib.h @@ -0,0 +1,100 @@ +/* +** $Id: lauxlib.h,v 1.1 2003/01/24 16:25:59 jason379 Exp $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lauxlib_h +#define lauxlib_h + + +#include +#include + +#include "lua.h" + + +#ifndef LUALIB_API +#define LUALIB_API extern +#endif + + +struct luaL_reg { + const char *name; + lua_CFunction func; +}; + + +LUALIB_API void luaL_openlib (lua_State *L, const struct luaL_reg *l, int n); +LUALIB_API void luaL_argerror (lua_State *L, int numarg, const char *extramsg); +LUALIB_API const char *luaL_check_lstr (lua_State *L, int numArg, size_t *len); +LUALIB_API const char *luaL_opt_lstr (lua_State *L, int numArg, const char *def, size_t *len); +LUALIB_API double luaL_check_number (lua_State *L, int numArg); +LUALIB_API double luaL_opt_number (lua_State *L, int numArg, double def); + +LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg); +LUALIB_API void luaL_checktype (lua_State *L, int narg, int t); +LUALIB_API void luaL_checkany (lua_State *L, int narg); + +LUALIB_API void luaL_verror (lua_State *L, const char *fmt, ...); +LUALIB_API int luaL_findstring (const char *name, const char *const list[]); + + + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + +#define luaL_arg_check(L, cond,numarg,extramsg) if (!(cond)) \ + luaL_argerror(L, numarg,extramsg) +#define luaL_check_string(L,n) (luaL_check_lstr(L, (n), NULL)) +#define luaL_opt_string(L,n,d) (luaL_opt_lstr(L, (n), (d), NULL)) +#define luaL_check_int(L,n) ((int)luaL_check_number(L, n)) +#define luaL_check_long(L,n) ((long)luaL_check_number(L, n)) +#define luaL_opt_int(L,n,d) ((int)luaL_opt_number(L, n,d)) +#define luaL_opt_long(L,n,d) ((long)luaL_opt_number(L, n,d)) +#define luaL_openl(L,a) luaL_openlib(L, a, (sizeof(a)/sizeof(a[0]))) + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + + +#ifndef LUAL_BUFFERSIZE +#define LUAL_BUFFERSIZE BUFSIZ +#endif + + +typedef struct luaL_Buffer { + char *p; /* current position in buffer */ + int level; + lua_State *L; + char buffer[LUAL_BUFFERSIZE]; +} luaL_Buffer; + +#define luaL_putchar(B,c) \ + ((void)((B)->p < &(B)->buffer[LUAL_BUFFERSIZE] || luaL_prepbuffer(B)), \ + (*(B)->p++ = (char)(c))) + +#define luaL_addsize(B,n) ((B)->p += (n)) + +LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B); +LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B); +LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l); +LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s); +LUALIB_API void luaL_addvalue (luaL_Buffer *B); +LUALIB_API void luaL_pushresult (luaL_Buffer *B); + + +/* }====================================================== */ + + +#endif + + diff --git a/build/premake/src/Src/Lua/lbaselib.c b/build/premake/src/Src/Lua/lbaselib.c new file mode 100644 index 0000000000..23c0e919f6 --- /dev/null +++ b/build/premake/src/Src/Lua/lbaselib.c @@ -0,0 +1,651 @@ +/* +** $Id: lbaselib.c,v 1.2 2003/04/23 12:16:05 jason379 Exp $ +** Basic library +** See Copyright Notice in lua.h +*/ + + + +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "luadebug.h" +#include "lualib.h" + + + +/* +** If your system does not support `stderr', redefine this function, or +** redefine _ERRORMESSAGE so that it won't need _ALERT. +*/ +static int luaB__ALERT (lua_State *L) { + fputs(luaL_check_string(L, 1), stderr); + return 0; +} + + +/* +** Basic implementation of _ERRORMESSAGE. +** The library `liolib' redefines _ERRORMESSAGE for better error information. +*/ +static int luaB__ERRORMESSAGE (lua_State *L) { + luaL_checktype(L, 1, LUA_TSTRING); + lua_getglobal(L, LUA_ALERT); + if (lua_isfunction(L, -1)) { /* avoid error loop if _ALERT is not defined */ + lua_Debug ar; + lua_pushstring(L, "error: "); + lua_pushvalue(L, 1); + if (lua_getstack(L, 1, &ar)) { + lua_getinfo(L, "Sl", &ar); + if (ar.source && ar.currentline > 0) { + char buff[100]; + sprintf(buff, "\n <%.70s: line %d>", ar.short_src, ar.currentline); + lua_pushstring(L, buff); + lua_concat(L, 2); + } + } + lua_pushstring(L, "\n"); + lua_concat(L, 3); + lua_rawcall(L, 1, 0); + } + return 0; +} + + +/* +** If your system does not support `stdout', you can just remove this function. +** If you need, you can define your own `print' function, following this +** model but changing `fputs' to put the strings at a proper place +** (a console window or a log file, for instance). +*/ +static int luaB_print (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int i; + lua_getglobal(L, "tostring"); + for (i=1; i<=n; i++) { + const char *s; + lua_pushvalue(L, -1); /* function to be called */ + lua_pushvalue(L, i); /* value to print */ + lua_rawcall(L, 1, 1); + s = lua_tostring(L, -1); /* get result */ + if (s == NULL) + lua_error(L, "`tostring' must return a string to `print'"); + if (i>1) fputs("\t", stdout); + fputs(s, stdout); + lua_pop(L, 1); /* pop result */ + } + fputs("\n", stdout); + return 0; +} + + +static int luaB_tonumber (lua_State *L) { + int base = luaL_opt_int(L, 2, 10); + if (base == 10) { /* standard conversion */ + luaL_checkany(L, 1); + if (lua_isnumber(L, 1)) { + lua_pushnumber(L, lua_tonumber(L, 1)); + return 1; + } + } + else { + const char *s1 = luaL_check_string(L, 1); + char *s2; + unsigned long n; + luaL_arg_check(L, 2 <= base && base <= 36, 2, "base out of range"); + n = strtoul(s1, &s2, base); + if (s1 != s2) { /* at least one valid digit? */ + while (isspace((unsigned char)*s2)) s2++; /* skip trailing spaces */ + if (*s2 == '\0') { /* no invalid trailing characters? */ + lua_pushnumber(L, n); + return 1; + } + } + } + lua_pushnil(L); /* else not a number */ + return 1; +} + + +static int luaB_error (lua_State *L) { + lua_error(L, luaL_opt_string(L, 1, NULL)); + return 0; /* to avoid warnings */ +} + +static int luaB_setglobal (lua_State *L) { + luaL_checkany(L, 2); + lua_setglobal(L, luaL_check_string(L, 1)); + return 0; +} + +static int luaB_getglobal (lua_State *L) { + lua_getglobal(L, luaL_check_string(L, 1)); + return 1; +} + +static int luaB_tag (lua_State *L) { + luaL_checkany(L, 1); + lua_pushnumber(L, lua_tag(L, 1)); + return 1; +} + +static int luaB_settag (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_pushvalue(L, 1); /* push table */ + lua_settag(L, luaL_check_int(L, 2)); + return 1; /* return table */ +} + +static int luaB_newtag (lua_State *L) { + lua_pushnumber(L, lua_newtag(L)); + return 1; +} + +static int luaB_copytagmethods (lua_State *L) { + lua_pushnumber(L, lua_copytagmethods(L, luaL_check_int(L, 1), + luaL_check_int(L, 2))); + return 1; +} + +static int luaB_globals (lua_State *L) { + lua_getglobals(L); /* value to be returned */ + if (!lua_isnull(L, 1)) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_pushvalue(L, 1); /* new table of globals */ + lua_setglobals(L); + } + return 1; +} + +static int luaB_rawget (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + lua_rawget(L, 1); + return 1; +} + +static int luaB_rawset (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + luaL_checkany(L, 3); + lua_rawset(L, 1); + return 1; +} + +static int luaB_settagmethod (lua_State *L) { + int tag = luaL_check_int(L, 1); + const char *event = luaL_check_string(L, 2); + luaL_arg_check(L, lua_isfunction(L, 3) || lua_isnil(L, 3), 3, + "function or nil expected"); + if (strcmp(event, "gc") == 0) + lua_error(L, "deprecated use: cannot set the `gc' tag method from Lua"); + lua_gettagmethod(L, tag, event); + lua_pushvalue(L, 3); + lua_settagmethod(L, tag, event); + return 1; +} + + +static int luaB_gettagmethod (lua_State *L) { + int tag = luaL_check_int(L, 1); + const char *event = luaL_check_string(L, 2); + if (strcmp(event, "gc") == 0) + lua_error(L, "deprecated use: cannot get the `gc' tag method from Lua"); + lua_gettagmethod(L, tag, event); + return 1; +} + + +static int luaB_gcinfo (lua_State *L) { + lua_pushnumber(L, lua_getgccount(L)); + lua_pushnumber(L, lua_getgcthreshold(L)); + return 2; +} + + +static int luaB_collectgarbage (lua_State *L) { + lua_setgcthreshold(L, luaL_opt_int(L, 1, 0)); + return 0; +} + + +static int luaB_type (lua_State *L) { + luaL_checkany(L, 1); + lua_pushstring(L, lua_typename(L, lua_type(L, 1))); + return 1; +} + + +static int luaB_next (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 2); /* create a 2nd argument if there isn't one */ + if (lua_next(L, 1)) + return 2; + else { + lua_pushnil(L); + return 1; + } +} + + +static int passresults (lua_State *L, int status, int oldtop) { + static const char *const errornames[] = + {"ok", "run-time error", "file error", "syntax error", + "memory error", "error in error handling"}; + if (status == 0) { + int nresults = lua_gettop(L) - oldtop; + if (nresults > 0) + return nresults; /* results are already on the stack */ + else { + lua_pushuserdata(L, NULL); /* at least one result to signal no errors */ + return 1; + } + } + else { /* error */ + lua_pushnil(L); + lua_pushstring(L, errornames[status]); /* error code */ + return 2; + } +} + +static int luaB_dostring (lua_State *L) { + int oldtop = lua_gettop(L); + size_t l; + const char *s = luaL_check_lstr(L, 1, &l); + if (*s == '\33') /* binary files start with ESC... */ + lua_error(L, "`dostring' cannot run pre-compiled code"); + return passresults(L, lua_dobuffer(L, s, l, luaL_opt_string(L, 2, s)), oldtop); +} + + +static int luaB_dofile (lua_State *L) { + int oldtop = lua_gettop(L); + const char *fname = luaL_opt_string(L, 1, NULL); + return passresults(L, lua_dofile(L, fname), oldtop); +} + + +static int luaB_call (lua_State *L) { + int oldtop; + const char *options = luaL_opt_string(L, 3, ""); + int err = 0; /* index of old error method */ + int i, status; + int n; + luaL_checktype(L, 2, LUA_TTABLE); + n = lua_getn(L, 2); + if (!lua_isnull(L, 4)) { /* set new error method */ + lua_getglobal(L, LUA_ERRORMESSAGE); + err = lua_gettop(L); /* get index */ + lua_pushvalue(L, 4); + lua_setglobal(L, LUA_ERRORMESSAGE); + } + oldtop = lua_gettop(L); /* top before function-call preparation */ + /* push function */ + lua_pushvalue(L, 1); + luaL_checkstack(L, n, "too many arguments"); + for (i=0; i=pos; n--) { + lua_rawgeti(L, 1, n); + lua_rawseti(L, 1, n+1); /* t[n+1] = t[n] */ + } + lua_pushvalue(L, v); + lua_rawseti(L, 1, pos); /* t[pos] = v */ + return 0; +} + + +static int luaB_tremove (lua_State *L) { + int pos, n; + luaL_checktype(L, 1, LUA_TTABLE); + n = lua_getn(L, 1); + pos = luaL_opt_int(L, 2, n); + if (n <= 0) return 0; /* table is "empty" */ + lua_rawgeti(L, 1, pos); /* result = t[pos] */ + for ( ;pos= P */ + while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { + if (i>u) lua_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[i] */ + } + /* repeat --j until a[j] <= P */ + while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { + if (jt.token); +} + + +/* +** Returns the the previous instruction, for optimizations. +** If there is a jump target between this and the current instruction, +** returns a dummy instruction to avoid wrong optimizations. +*/ +static Instruction previous_instruction (FuncState *fs) { + if (fs->pc > fs->lasttarget) /* no jumps to current position? */ + return fs->f->code[fs->pc-1]; /* returns previous instruction */ + else + return CREATE_0(OP_END); /* no optimizations after an `END' */ +} + + +int luaK_jump (FuncState *fs) { + int j = luaK_code1(fs, OP_JMP, NO_JUMP); + if (j == fs->lasttarget) { /* possible jumps to this jump? */ + luaK_concat(fs, &j, fs->jlt); /* keep them on hold */ + fs->jlt = NO_JUMP; + } + return j; +} + + +static void luaK_fixjump (FuncState *fs, int pc, int dest) { + Instruction *jmp = &fs->f->code[pc]; + if (dest == NO_JUMP) + SETARG_S(*jmp, NO_JUMP); /* point to itself to represent end of list */ + else { /* jump is relative to position following jump instruction */ + int offset = dest-(pc+1); + if (abs(offset) > MAXARG_S) + luaK_error(fs->ls, "control structure too long"); + SETARG_S(*jmp, offset); + } +} + + +static int luaK_getjump (FuncState *fs, int pc) { + int offset = GETARG_S(fs->f->code[pc]); + if (offset == NO_JUMP) /* point to itself represents end of list */ + return NO_JUMP; /* end of list */ + else + return (pc+1)+offset; /* turn offset into absolute position */ +} + + +/* +** returns current `pc' and marks it as a jump target (to avoid wrong +** optimizations with consecutive instructions not in the same basic block). +** discharge list of jumps to last target. +*/ +int luaK_getlabel (FuncState *fs) { + if (fs->pc != fs->lasttarget) { + int lasttarget = fs->lasttarget; + fs->lasttarget = fs->pc; + luaK_patchlist(fs, fs->jlt, lasttarget); /* discharge old list `jlt' */ + fs->jlt = NO_JUMP; /* nobody jumps to this new label (yet) */ + } + return fs->pc; +} + + +void luaK_deltastack (FuncState *fs, int delta) { + fs->stacklevel += delta; + if (fs->stacklevel > fs->f->maxstacksize) { + if (fs->stacklevel > MAXSTACK) + luaK_error(fs->ls, "function or expression too complex"); + fs->f->maxstacksize = fs->stacklevel; + } +} + + +void luaK_kstr (LexState *ls, int c) { + luaK_code1(ls->fs, OP_PUSHSTRING, c); +} + + +static int number_constant (FuncState *fs, Number r) { + /* check whether `r' has appeared within the last LOOKBACKNUMS entries */ + Proto *f = fs->f; + int c = f->nknum; + int lim = c < LOOKBACKNUMS ? 0 : c-LOOKBACKNUMS; + while (--c >= lim) + if (f->knum[c] == r) return c; + /* not found; create a new entry */ + luaM_growvector(fs->L, f->knum, f->nknum, 1, Number, + "constant table overflow", MAXARG_U); + c = f->nknum++; + f->knum[c] = r; + return c; +} + + +void luaK_number (FuncState *fs, Number f) { + if (f <= (Number)MAXARG_S && (Number)(int)f == f) + luaK_code1(fs, OP_PUSHINT, (int)f); /* f has a short integer value */ + else + luaK_code1(fs, OP_PUSHNUM, number_constant(fs, f)); +} + + +void luaK_adjuststack (FuncState *fs, int n) { + if (n > 0) + luaK_code1(fs, OP_POP, n); + else + luaK_code1(fs, OP_PUSHNIL, -n); +} + + +int luaK_lastisopen (FuncState *fs) { + /* check whether last instruction is an open function call */ + Instruction i = previous_instruction(fs); + if (GET_OPCODE(i) == OP_CALL && GETARG_B(i) == MULT_RET) + return 1; + else return 0; +} + + +void luaK_setcallreturns (FuncState *fs, int nresults) { + if (luaK_lastisopen(fs)) { /* expression is an open function call? */ + SETARG_B(fs->f->code[fs->pc-1], nresults); /* set number of results */ + luaK_deltastack(fs, nresults); /* push results */ + } +} + + +static int discharge (FuncState *fs, expdesc *var) { + switch (var->k) { + case VLOCAL: + luaK_code1(fs, OP_GETLOCAL, var->u.index); + break; + case VGLOBAL: + luaK_code1(fs, OP_GETGLOBAL, var->u.index); + break; + case VINDEXED: + luaK_code0(fs, OP_GETTABLE); + break; + case VEXP: + return 0; /* nothing to do */ + } + var->k = VEXP; + var->u.l.t = var->u.l.f = NO_JUMP; + return 1; +} + + +static void discharge1 (FuncState *fs, expdesc *var) { + discharge(fs, var); + /* if it has jumps then it is already discharged */ + if (var->u.l.t == NO_JUMP && var->u.l.f == NO_JUMP) + luaK_setcallreturns(fs, 1); /* call must return 1 value */ +} + + +void luaK_storevar (LexState *ls, const expdesc *var) { + FuncState *fs = ls->fs; + switch (var->k) { + case VLOCAL: + luaK_code1(fs, OP_SETLOCAL, var->u.index); + break; + case VGLOBAL: + luaK_code1(fs, OP_SETGLOBAL, var->u.index); + break; + case VINDEXED: /* table is at top-3; pop 3 elements after operation */ + luaK_code2(fs, OP_SETTABLE, 3, 3); + break; + default: + LUA_INTERNALERROR("invalid var kind to store"); + } +} + + +static OpCode invertjump (OpCode op) { + switch (op) { + case OP_JMPNE: return OP_JMPEQ; + case OP_JMPEQ: return OP_JMPNE; + case OP_JMPLT: return OP_JMPGE; + case OP_JMPLE: return OP_JMPGT; + case OP_JMPGT: return OP_JMPLE; + case OP_JMPGE: return OP_JMPLT; + case OP_JMPT: case OP_JMPONT: return OP_JMPF; + case OP_JMPF: case OP_JMPONF: return OP_JMPT; + default: + LUA_INTERNALERROR("invalid jump instruction"); + return OP_END; /* to avoid warnings */ + } +} + + +static void luaK_patchlistaux (FuncState *fs, int list, int target, + OpCode special, int special_target) { + Instruction *code = fs->f->code; + while (list != NO_JUMP) { + int next = luaK_getjump(fs, list); + Instruction *i = &code[list]; + OpCode op = GET_OPCODE(*i); + if (op == special) /* this `op' already has a value */ + luaK_fixjump(fs, list, special_target); + else { + luaK_fixjump(fs, list, target); /* do the patch */ + if (op == OP_JMPONT) /* remove eventual values */ + SET_OPCODE(*i, OP_JMPT); + else if (op == OP_JMPONF) + SET_OPCODE(*i, OP_JMPF); + } + list = next; + } +} + + +void luaK_patchlist (FuncState *fs, int list, int target) { + if (target == fs->lasttarget) /* same target that list `jlt'? */ + luaK_concat(fs, &fs->jlt, list); /* delay fixing */ + else + luaK_patchlistaux(fs, list, target, OP_END, 0); +} + + +static int need_value (FuncState *fs, int list, OpCode hasvalue) { + /* check whether list has a jump without a value */ + for (; list != NO_JUMP; list = luaK_getjump(fs, list)) + if (GET_OPCODE(fs->f->code[list]) != hasvalue) return 1; + return 0; /* not found */ +} + + +void luaK_concat (FuncState *fs, int *l1, int l2) { + if (*l1 == NO_JUMP) + *l1 = l2; + else { + int list = *l1; + for (;;) { /* traverse `l1' */ + int next = luaK_getjump(fs, list); + if (next == NO_JUMP) { /* end of list? */ + luaK_fixjump(fs, list, l2); + return; + } + list = next; + } + } +} + + +static void luaK_testgo (FuncState *fs, expdesc *v, int invert, OpCode jump) { + int prevpos; /* position of last instruction */ + Instruction *previous; + int *golist, *exitlist; + if (!invert) { + golist = &v->u.l.f; /* go if false */ + exitlist = &v->u.l.t; /* exit if true */ + } + else { + golist = &v->u.l.t; /* go if true */ + exitlist = &v->u.l.f; /* exit if false */ + } + discharge1(fs, v); + prevpos = fs->pc-1; + previous = &fs->f->code[prevpos]; + LUA_ASSERT(*previous==previous_instruction(fs), "no jump allowed here"); + if (!ISJUMP(GET_OPCODE(*previous))) + prevpos = luaK_code1(fs, jump, NO_JUMP); + else { /* last instruction is already a jump */ + if (invert) + SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); + } + luaK_concat(fs, exitlist, prevpos); /* insert last jump in `exitlist' */ + luaK_patchlist(fs, *golist, luaK_getlabel(fs)); + *golist = NO_JUMP; +} + + +void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue) { + luaK_testgo(fs, v, 1, keepvalue ? OP_JMPONF : OP_JMPF); +} + + +static void luaK_goiffalse (FuncState *fs, expdesc *v, int keepvalue) { + luaK_testgo(fs, v, 0, keepvalue ? OP_JMPONT : OP_JMPT); +} + + +static int code_label (FuncState *fs, OpCode op, int arg) { + luaK_getlabel(fs); /* those instructions may be jump targets */ + return luaK_code1(fs, op, arg); +} + + +void luaK_tostack (LexState *ls, expdesc *v, int onlyone) { + FuncState *fs = ls->fs; + if (!discharge(fs, v)) { /* `v' is an expression? */ + OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]); + if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) { + /* expression has no jumps */ + if (onlyone) + luaK_setcallreturns(fs, 1); /* call must return 1 value */ + } + else { /* expression has jumps */ + int final; /* position after whole expression */ + int j = NO_JUMP; /* eventual jump over values */ + int p_nil = NO_JUMP; /* position of an eventual PUSHNIL */ + int p_1 = NO_JUMP; /* position of an eventual PUSHINT */ + if (ISJUMP(previous) || need_value(fs, v->u.l.f, OP_JMPONF) + || need_value(fs, v->u.l.t, OP_JMPONT)) { + /* expression needs values */ + if (ISJUMP(previous)) + luaK_concat(fs, &v->u.l.t, fs->pc-1); /* put `previous' in t. list */ + else { + j = code_label(fs, OP_JMP, NO_JUMP); /* to jump over both pushes */ + /* correct stack for compiler and symbolic execution */ + luaK_adjuststack(fs, 1); + } + p_nil = code_label(fs, OP_PUSHNILJMP, 0); + p_1 = code_label(fs, OP_PUSHINT, 1); + luaK_patchlist(fs, j, luaK_getlabel(fs)); + } + final = luaK_getlabel(fs); + luaK_patchlistaux(fs, v->u.l.f, p_nil, OP_JMPONF, final); + luaK_patchlistaux(fs, v->u.l.t, p_1, OP_JMPONT, final); + v->u.l.f = v->u.l.t = NO_JUMP; + } + } +} + + +void luaK_prefix (LexState *ls, UnOpr op, expdesc *v) { + FuncState *fs = ls->fs; + if (op == OPR_MINUS) { + luaK_tostack(ls, v, 1); + luaK_code0(fs, OP_MINUS); + } + else { /* op == NOT */ + Instruction *previous; + discharge1(fs, v); + previous = &fs->f->code[fs->pc-1]; + if (ISJUMP(GET_OPCODE(*previous))) + SET_OPCODE(*previous, invertjump(GET_OPCODE(*previous))); + else + luaK_code0(fs, OP_NOT); + /* interchange true and false lists */ + { int temp = v->u.l.f; v->u.l.f = v->u.l.t; v->u.l.t = temp; } + } +} + + +void luaK_infix (LexState *ls, BinOpr op, expdesc *v) { + FuncState *fs = ls->fs; + switch (op) { + case OPR_AND: + luaK_goiftrue(fs, v, 1); + break; + case OPR_OR: + luaK_goiffalse(fs, v, 1); + break; + default: + luaK_tostack(ls, v, 1); /* all other binary operators need a value */ + } +} + + + +static const struct { + OpCode opcode; /* opcode for each binary operator */ + int arg; /* default argument for the opcode */ +} codes[] = { /* ORDER OPR */ + {OP_ADD, 0}, {OP_SUB, 0}, {OP_MULT, 0}, {OP_DIV, 0}, + {OP_POW, 0}, {OP_CONCAT, 2}, + {OP_JMPNE, NO_JUMP}, {OP_JMPEQ, NO_JUMP}, + {OP_JMPLT, NO_JUMP}, {OP_JMPLE, NO_JUMP}, + {OP_JMPGT, NO_JUMP}, {OP_JMPGE, NO_JUMP} +}; + + +void luaK_posfix (LexState *ls, BinOpr op, expdesc *v1, expdesc *v2) { + FuncState *fs = ls->fs; + switch (op) { + case OPR_AND: { + LUA_ASSERT(v1->u.l.t == NO_JUMP, "list must be closed"); + discharge1(fs, v2); + v1->u.l.t = v2->u.l.t; + luaK_concat(fs, &v1->u.l.f, v2->u.l.f); + break; + } + case OPR_OR: { + LUA_ASSERT(v1->u.l.f == NO_JUMP, "list must be closed"); + discharge1(fs, v2); + v1->u.l.f = v2->u.l.f; + luaK_concat(fs, &v1->u.l.t, v2->u.l.t); + break; + } + default: { + luaK_tostack(ls, v2, 1); /* `v2' must be a value */ + luaK_code1(fs, codes[op].opcode, codes[op].arg); + } + } +} + + +static void codelineinfo (FuncState *fs) { + Proto *f = fs->f; + LexState *ls = fs->ls; + if (ls->lastline > fs->lastline) { + luaM_growvector(fs->L, f->lineinfo, f->nlineinfo, 2, int, + "line info overflow", MAX_INT); + if (ls->lastline > fs->lastline+1) + f->lineinfo[f->nlineinfo++] = -(ls->lastline - (fs->lastline+1)); + f->lineinfo[f->nlineinfo++] = fs->pc; + fs->lastline = ls->lastline; + } +} + + +int luaK_code0 (FuncState *fs, OpCode o) { + return luaK_code2(fs, o, 0, 0); +} + + +int luaK_code1 (FuncState *fs, OpCode o, int arg1) { + return luaK_code2(fs, o, arg1, 0); +} + + +int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2) { + Instruction i = previous_instruction(fs); + int delta = luaK_opproperties[o].push - luaK_opproperties[o].pop; + int optm = 0; /* 1 when there is an optimization */ + switch (o) { + case OP_CLOSURE: { + delta = -arg2+1; + break; + } + case OP_SETTABLE: { + delta = -arg2; + break; + } + case OP_SETLIST: { + if (arg2 == 0) return NO_JUMP; /* nothing to do */ + delta = -arg2; + break; + } + case OP_SETMAP: { + if (arg1 == 0) return NO_JUMP; /* nothing to do */ + delta = -2*arg1; + break; + } + case OP_RETURN: { + if (GET_OPCODE(i) == OP_CALL && GETARG_B(i) == MULT_RET) { + SET_OPCODE(i, OP_TAILCALL); + SETARG_B(i, arg1); + optm = 1; + } + break; + } + case OP_PUSHNIL: { + if (arg1 == 0) return NO_JUMP; /* nothing to do */ + delta = arg1; + switch(GET_OPCODE(i)) { + case OP_PUSHNIL: SETARG_U(i, GETARG_U(i)+arg1); optm = 1; break; + default: break; + } + break; + } + case OP_POP: { + if (arg1 == 0) return NO_JUMP; /* nothing to do */ + delta = -arg1; + switch(GET_OPCODE(i)) { + case OP_SETTABLE: SETARG_B(i, GETARG_B(i)+arg1); optm = 1; break; + default: break; + } + break; + } + case OP_GETTABLE: { + switch(GET_OPCODE(i)) { + case OP_PUSHSTRING: /* `t.x' */ + SET_OPCODE(i, OP_GETDOTTED); + optm = 1; + break; + case OP_GETLOCAL: /* `t[i]' */ + SET_OPCODE(i, OP_GETINDEXED); + optm = 1; + break; + default: break; + } + break; + } + case OP_ADD: { + switch(GET_OPCODE(i)) { + case OP_PUSHINT: SET_OPCODE(i, OP_ADDI); optm = 1; break; /* `a+k' */ + default: break; + } + break; + } + case OP_SUB: { + switch(GET_OPCODE(i)) { + case OP_PUSHINT: /* `a-k' */ + i = CREATE_S(OP_ADDI, -GETARG_S(i)); + optm = 1; + break; + default: break; + } + break; + } + case OP_CONCAT: { + delta = -arg1+1; + switch(GET_OPCODE(i)) { + case OP_CONCAT: /* `a..b..c' */ + SETARG_U(i, GETARG_U(i)+1); + optm = 1; + break; + default: break; + } + break; + } + case OP_MINUS: { + switch(GET_OPCODE(i)) { + case OP_PUSHINT: /* `-k' */ + SETARG_S(i, -GETARG_S(i)); + optm = 1; + break; + case OP_PUSHNUM: /* `-k' */ + SET_OPCODE(i, OP_PUSHNEGNUM); + optm = 1; + break; + default: break; + } + break; + } + case OP_JMPNE: { + if (i == CREATE_U(OP_PUSHNIL, 1)) { /* `a~=nil' */ + i = CREATE_S(OP_JMPT, NO_JUMP); + optm = 1; + } + break; + } + case OP_JMPEQ: { + if (i == CREATE_U(OP_PUSHNIL, 1)) { /* `a==nil' */ + i = CREATE_0(OP_NOT); + delta = -1; /* just undo effect of previous PUSHNIL */ + optm = 1; + } + break; + } + case OP_JMPT: + case OP_JMPONT: { + switch (GET_OPCODE(i)) { + case OP_NOT: { + i = CREATE_S(OP_JMPF, NO_JUMP); + optm = 1; + break; + } + case OP_PUSHINT: { + if (o == OP_JMPT) { /* JMPONT must keep original integer value */ + i = CREATE_S(OP_JMP, NO_JUMP); + optm = 1; + } + break; + } + case OP_PUSHNIL: { + if (GETARG_U(i) == 1) { + fs->pc--; /* erase previous instruction */ + luaK_deltastack(fs, -1); /* correct stack */ + return NO_JUMP; + } + break; + } + default: break; + } + break; + } + case OP_JMPF: + case OP_JMPONF: { + switch (GET_OPCODE(i)) { + case OP_NOT: { + i = CREATE_S(OP_JMPT, NO_JUMP); + optm = 1; + break; + } + case OP_PUSHINT: { /* `while 1 do ...' */ + fs->pc--; /* erase previous instruction */ + luaK_deltastack(fs, -1); /* correct stack */ + return NO_JUMP; + } + case OP_PUSHNIL: { /* `repeat ... until nil' */ + if (GETARG_U(i) == 1) { + i = CREATE_S(OP_JMP, NO_JUMP); + optm = 1; + } + break; + } + default: break; + } + break; + } + case OP_GETDOTTED: + case OP_GETINDEXED: + case OP_TAILCALL: + case OP_ADDI: { + LUA_INTERNALERROR("instruction used only for optimizations"); + break; + } + default: { + LUA_ASSERT(delta != VD, "invalid delta"); + break; + } + } + luaK_deltastack(fs, delta); + if (optm) { /* optimize: put instruction in place of last one */ + fs->f->code[fs->pc-1] = i; /* change previous instruction */ + return fs->pc-1; /* do not generate new instruction */ + } + /* else build new instruction */ + switch ((enum Mode)luaK_opproperties[o].mode) { + case iO: i = CREATE_0(o); break; + case iU: i = CREATE_U(o, arg1); break; + case iS: i = CREATE_S(o, arg1); break; + case iAB: i = CREATE_AB(o, arg1, arg2); break; + } + codelineinfo(fs); + /* put new instruction in code array */ + luaM_growvector(fs->L, fs->f->code, fs->pc, 1, Instruction, + "code size overflow", MAX_INT); + fs->f->code[fs->pc] = i; + return fs->pc++; +} + + +const struct OpProperties luaK_opproperties[NUM_OPCODES] = { + {iO, 0, 0}, /* OP_END */ + {iU, 0, 0}, /* OP_RETURN */ + {iAB, 0, 0}, /* OP_CALL */ + {iAB, 0, 0}, /* OP_TAILCALL */ + {iU, VD, 0}, /* OP_PUSHNIL */ + {iU, VD, 0}, /* OP_POP */ + {iS, 1, 0}, /* OP_PUSHINT */ + {iU, 1, 0}, /* OP_PUSHSTRING */ + {iU, 1, 0}, /* OP_PUSHNUM */ + {iU, 1, 0}, /* OP_PUSHNEGNUM */ + {iU, 1, 0}, /* OP_PUSHUPVALUE */ + {iU, 1, 0}, /* OP_GETLOCAL */ + {iU, 1, 0}, /* OP_GETGLOBAL */ + {iO, 1, 2}, /* OP_GETTABLE */ + {iU, 1, 1}, /* OP_GETDOTTED */ + {iU, 1, 1}, /* OP_GETINDEXED */ + {iU, 2, 1}, /* OP_PUSHSELF */ + {iU, 1, 0}, /* OP_CREATETABLE */ + {iU, 0, 1}, /* OP_SETLOCAL */ + {iU, 0, 1}, /* OP_SETGLOBAL */ + {iAB, VD, 0}, /* OP_SETTABLE */ + {iAB, VD, 0}, /* OP_SETLIST */ + {iU, VD, 0}, /* OP_SETMAP */ + {iO, 1, 2}, /* OP_ADD */ + {iS, 1, 1}, /* OP_ADDI */ + {iO, 1, 2}, /* OP_SUB */ + {iO, 1, 2}, /* OP_MULT */ + {iO, 1, 2}, /* OP_DIV */ + {iO, 1, 2}, /* OP_POW */ + {iU, VD, 0}, /* OP_CONCAT */ + {iO, 1, 1}, /* OP_MINUS */ + {iO, 1, 1}, /* OP_NOT */ + {iS, 0, 2}, /* OP_JMPNE */ + {iS, 0, 2}, /* OP_JMPEQ */ + {iS, 0, 2}, /* OP_JMPLT */ + {iS, 0, 2}, /* OP_JMPLE */ + {iS, 0, 2}, /* OP_JMPGT */ + {iS, 0, 2}, /* OP_JMPGE */ + {iS, 0, 1}, /* OP_JMPT */ + {iS, 0, 1}, /* OP_JMPF */ + {iS, 0, 1}, /* OP_JMPONT */ + {iS, 0, 1}, /* OP_JMPONF */ + {iS, 0, 0}, /* OP_JMP */ + {iO, 0, 0}, /* OP_PUSHNILJMP */ + {iS, 0, 0}, /* OP_FORPREP */ + {iS, 0, 3}, /* OP_FORLOOP */ + {iS, 2, 0}, /* OP_LFORPREP */ + {iS, 0, 3}, /* OP_LFORLOOP */ + {iAB, VD, 0} /* OP_CLOSURE */ +}; + diff --git a/build/premake/src/Src/Lua/lcode.h b/build/premake/src/Src/Lua/lcode.h new file mode 100644 index 0000000000..f30ba3ac11 --- /dev/null +++ b/build/premake/src/Src/Lua/lcode.h @@ -0,0 +1,70 @@ +/* +** $Id: lcode.h,v 1.1 2003/01/24 16:26:01 jason379 Exp $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lcode_h +#define lcode_h + +#include "llex.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" + + +/* +** Marks the end of a patch list. It is an invalid value both as an absolute +** address, and as a list link (would link an element to itself). +*/ +#define NO_JUMP (-1) + + +/* +** grep "ORDER OPR" if you change these enums +*/ +typedef enum BinOpr { + OPR_ADD, OPR_SUB, OPR_MULT, OPR_DIV, OPR_POW, + OPR_CONCAT, + OPR_NE, OPR_EQ, OPR_LT, OPR_LE, OPR_GT, OPR_GE, + OPR_AND, OPR_OR, + OPR_NOBINOPR +} BinOpr; + +typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_NOUNOPR } UnOpr; + + +enum Mode {iO, iU, iS, iAB}; /* instruction format */ + +#define VD 100 /* flag for variable delta */ + +extern const struct OpProperties { + char mode; + unsigned char push; + unsigned char pop; +} luaK_opproperties[]; + + +void luaK_error (LexState *ls, const char *msg); +int luaK_code0 (FuncState *fs, OpCode o); +int luaK_code1 (FuncState *fs, OpCode o, int arg1); +int luaK_code2 (FuncState *fs, OpCode o, int arg1, int arg2); +int luaK_jump (FuncState *fs); +void luaK_patchlist (FuncState *fs, int list, int target); +void luaK_concat (FuncState *fs, int *l1, int l2); +void luaK_goiftrue (FuncState *fs, expdesc *v, int keepvalue); +int luaK_getlabel (FuncState *fs); +void luaK_deltastack (FuncState *fs, int delta); +void luaK_kstr (LexState *ls, int c); +void luaK_number (FuncState *fs, Number f); +void luaK_adjuststack (FuncState *fs, int n); +int luaK_lastisopen (FuncState *fs); +void luaK_setcallreturns (FuncState *fs, int nresults); +void luaK_tostack (LexState *ls, expdesc *v, int onlyone); +void luaK_storevar (LexState *ls, const expdesc *var); +void luaK_prefix (LexState *ls, UnOpr op, expdesc *v); +void luaK_infix (LexState *ls, BinOpr op, expdesc *v); +void luaK_posfix (LexState *ls, BinOpr op, expdesc *v1, expdesc *v2); + + +#endif diff --git a/build/premake/src/Src/Lua/ldebug.c b/build/premake/src/Src/Lua/ldebug.c new file mode 100644 index 0000000000..22836a4cc4 --- /dev/null +++ b/build/premake/src/Src/Lua/ldebug.c @@ -0,0 +1,466 @@ +/* +** $Id: ldebug.c,v 1.1 2003/01/24 16:26:01 jason379 Exp $ +** Debug Interface +** See Copyright Notice in lua.h +*/ + + +#include + +#include "lua.h" + +#include "lapi.h" +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "luadebug.h" + + + +static const char *getfuncname (lua_State *L, StkId f, const char **name); + + +static void setnormalized (TObject *d, const TObject *s) { + if (ttype(s) == LUA_TMARK) { + clvalue(d) = infovalue(s)->func; + ttype(d) = LUA_TFUNCTION; + } + else *d = *s; +} + + +static int isLmark (StkId o) { + return (o && ttype(o) == LUA_TMARK && !infovalue(o)->func->isC); +} + + +LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func) { + lua_Hook oldhook = L->callhook; + L->callhook = func; + return oldhook; +} + + +LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func) { + lua_Hook oldhook = L->linehook; + L->linehook = func; + return oldhook; +} + + +static StkId aux_stackedfunction (lua_State *L, int level, StkId top) { + int i; + for (i = (top-1) - L->stack; i>=0; i--) { + if (is_T_MARK(L->stack[i].ttype)) { + if (level == 0) + return L->stack+i; + level--; + } + } + return NULL; +} + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { + StkId f = aux_stackedfunction(L, level, L->top); + if (f == NULL) return 0; /* there is no such level */ + else { + ar->_func = f; + return 1; + } +} + + +static int nups (StkId f) { + switch (ttype(f)) { + case LUA_TFUNCTION: + return clvalue(f)->nupvalues; + case LUA_TMARK: + return infovalue(f)->func->nupvalues; + default: + return 0; + } +} + + +int luaG_getline (int *lineinfo, int pc, int refline, int *prefi) { + int refi; + if (lineinfo == NULL || pc == -1) + return -1; /* no line info or function is not active */ + refi = prefi ? *prefi : 0; + if (lineinfo[refi] < 0) + refline += -lineinfo[refi++]; + LUA_ASSERT(lineinfo[refi] >= 0, "invalid line info"); + while (lineinfo[refi] > pc) { + refline--; + refi--; + if (lineinfo[refi] < 0) + refline -= -lineinfo[refi--]; + LUA_ASSERT(lineinfo[refi] >= 0, "invalid line info"); + } + for (;;) { + int nextline = refline + 1; + int nextref = refi + 1; + if (lineinfo[nextref] < 0) + nextline += -lineinfo[nextref++]; + LUA_ASSERT(lineinfo[nextref] >= 0, "invalid line info"); + if (lineinfo[nextref] > pc) + break; + refline = nextline; + refi = nextref; + } + if (prefi) *prefi = refi; + return refline; +} + + +static int currentpc (StkId f) { + CallInfo *ci = infovalue(f); + LUA_ASSERT(isLmark(f), "function has no pc"); + if (ci->pc) + return (*ci->pc - ci->func->f.l->code) - 1; + else + return -1; /* function is not active */ +} + + +static int currentline (StkId f) { + if (!isLmark(f)) + return -1; /* only active lua functions have current-line information */ + else { + CallInfo *ci = infovalue(f); + int *lineinfo = ci->func->f.l->lineinfo; + return luaG_getline(lineinfo, currentpc(f), 1, NULL); + } +} + + + +static Proto *getluaproto (StkId f) { + return (isLmark(f) ? infovalue(f)->func->f.l : NULL); +} + + +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { + const char *name; + StkId f = ar->_func; + Proto *fp = getluaproto(f); + if (!fp) return NULL; /* `f' is not a Lua function? */ + name = luaF_getlocalname(fp, n, currentpc(f)); + if (!name) return NULL; + luaA_pushobject(L, (f+1)+(n-1)); /* push value */ + return name; +} + + +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { + const char *name; + StkId f = ar->_func; + Proto *fp = getluaproto(f); + L->top--; /* pop new value */ + if (!fp) return NULL; /* `f' is not a Lua function? */ + name = luaF_getlocalname(fp, n, currentpc(f)); + if (!name || name[0] == '(') return NULL; /* `(' starts private locals */ + *((f+1)+(n-1)) = *L->top; + return name; +} + + +static void infoLproto (lua_Debug *ar, Proto *f) { + ar->source = f->source->str; + ar->linedefined = f->lineDefined; + ar->what = "Lua"; +} + + +static void funcinfo (lua_State *L, lua_Debug *ar, StkId func) { + Closure *cl = NULL; + switch (ttype(func)) { + case LUA_TFUNCTION: + cl = clvalue(func); + break; + case LUA_TMARK: + cl = infovalue(func)->func; + break; + default: + lua_error(L, "value for `lua_getinfo' is not a function"); + } + if (cl->isC) { + ar->source = "=C"; + ar->linedefined = -1; + ar->what = "C"; + } + else + infoLproto(ar, cl->f.l); + luaO_chunkid(ar->short_src, ar->source, sizeof(ar->short_src)); + if (ar->linedefined == 0) + ar->what = "main"; +} + + +static const char *travtagmethods (lua_State *L, const TObject *o) { + if (ttype(o) == LUA_TFUNCTION) { + int e; + for (e=0; elast_tag; t++) + if (clvalue(o) == luaT_gettm(L, t, e)) + return luaT_eventname[e]; + } + } + return NULL; +} + + +static const char *travglobals (lua_State *L, const TObject *o) { + Hash *g = L->gt; + int i; + for (i=0; isize; i++) { + if (luaO_equalObj(o, val(node(g, i))) && + ttype(key(node(g, i))) == LUA_TSTRING) + return tsvalue(key(node(g, i)))->str; + } + return NULL; +} + + +static void getname (lua_State *L, StkId f, lua_Debug *ar) { + TObject o; + setnormalized(&o, f); + /* try to find a name for given function */ + if ((ar->name = travglobals(L, &o)) != NULL) + ar->namewhat = "global"; + /* not found: try tag methods */ + else if ((ar->name = travtagmethods(L, &o)) != NULL) + ar->namewhat = "tag-method"; + else ar->namewhat = ""; /* not found at all */ +} + + +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { + StkId func; + int isactive = (*what != '>'); + if (isactive) + func = ar->_func; + else { + what++; /* skip the '>' */ + func = L->top - 1; + } + for (; *what; what++) { + switch (*what) { + case 'S': { + funcinfo(L, ar, func); + break; + } + case 'l': { + ar->currentline = currentline(func); + break; + } + case 'u': { + ar->nups = nups(func); + break; + } + case 'n': { + ar->namewhat = (isactive) ? getfuncname(L, func, &ar->name) : NULL; + if (ar->namewhat == NULL) + getname(L, func, ar); + break; + } + case 'f': { + setnormalized(L->top, func); + incr_top; /* push function */ + break; + } + default: return 0; /* invalid option */ + } + } + if (!isactive) L->top--; /* pop function */ + return 1; +} + + +/* +** {====================================================== +** Symbolic Execution +** ======================================================= +*/ + + +static int pushpc (int *stack, int pc, int top, int n) { + while (n--) + stack[top++] = pc-1; + return top; +} + + +static Instruction luaG_symbexec (const Proto *pt, int lastpc, int stackpos) { + int stack[MAXSTACK]; /* stores last instruction that changed a stack entry */ + const Instruction *code = pt->code; + int top = pt->numparams; + int pc = 0; + if (pt->is_vararg) /* varargs? */ + top++; /* `arg' */ + while (pc < lastpc) { + const Instruction i = code[pc++]; + LUA_ASSERT(0 <= top && top <= pt->maxstacksize, "wrong stack"); + switch (GET_OPCODE(i)) { + case OP_RETURN: { + LUA_ASSERT(top >= GETARG_U(i), "wrong stack"); + top = GETARG_U(i); + break; + } + case OP_TAILCALL: { + LUA_ASSERT(top >= GETARG_A(i), "wrong stack"); + top = GETARG_B(i); + break; + } + case OP_CALL: { + int nresults = GETARG_B(i); + if (nresults == MULT_RET) nresults = 1; + LUA_ASSERT(top >= GETARG_A(i), "wrong stack"); + top = pushpc(stack, pc, GETARG_A(i), nresults); + break; + } + case OP_PUSHNIL: { + top = pushpc(stack, pc, top, GETARG_U(i)); + break; + } + case OP_POP: { + top -= GETARG_U(i); + break; + } + case OP_SETTABLE: + case OP_SETLIST: { + top -= GETARG_B(i); + break; + } + case OP_SETMAP: { + top -= 2*GETARG_U(i); + break; + } + case OP_CONCAT: { + top -= GETARG_U(i); + stack[top++] = pc-1; + break; + } + case OP_CLOSURE: { + top -= GETARG_B(i); + stack[top++] = pc-1; + break; + } + case OP_JMPONT: + case OP_JMPONF: { + int newpc = pc + GETARG_S(i); + /* jump is forward and do not skip `lastpc'? */ + if (pc < newpc && newpc <= lastpc) { + stack[top-1] = pc-1; /* value comes from `and'/`or' */ + pc = newpc; /* do the jump */ + } + else + top--; /* do not jump; pop value */ + break; + } + default: { + OpCode op = GET_OPCODE(i); + LUA_ASSERT(luaK_opproperties[op].push != VD, + "invalid opcode for default"); + top -= luaK_opproperties[op].pop; + LUA_ASSERT(top >= 0, "wrong stack"); + top = pushpc(stack, pc, top, luaK_opproperties[op].push); + } + } + } + return code[stack[stackpos]]; +} + + +static const char *getobjname (lua_State *L, StkId obj, const char **name) { + StkId func = aux_stackedfunction(L, 0, obj); + if (!isLmark(func)) + return NULL; /* not an active Lua function */ + else { + Proto *p = infovalue(func)->func->f.l; + int pc = currentpc(func); + int stackpos = obj - (func+1); /* func+1 == function base */ + Instruction i = luaG_symbexec(p, pc, stackpos); + LUA_ASSERT(pc != -1, "function must be active"); + switch (GET_OPCODE(i)) { + case OP_GETGLOBAL: { + *name = p->kstr[GETARG_U(i)]->str; + return "global"; + } + case OP_GETLOCAL: { + *name = luaF_getlocalname(p, GETARG_U(i)+1, pc); + LUA_ASSERT(*name, "local must exist"); + return "local"; + } + case OP_PUSHSELF: + case OP_GETDOTTED: { + *name = p->kstr[GETARG_U(i)]->str; + return "field"; + } + default: + return NULL; /* no useful name found */ + } + } +} + + +static const char *getfuncname (lua_State *L, StkId f, const char **name) { + StkId func = aux_stackedfunction(L, 0, f); /* calling function */ + if (!isLmark(func)) + return NULL; /* not an active Lua function */ + else { + Proto *p = infovalue(func)->func->f.l; + int pc = currentpc(func); + Instruction i; + if (pc == -1) return NULL; /* function is not activated */ + i = p->code[pc]; + switch (GET_OPCODE(i)) { + case OP_CALL: case OP_TAILCALL: + return getobjname(L, (func+1)+GETARG_A(i), name); + default: + return NULL; /* no useful name found */ + } + } +} + + +/* }====================================================== */ + + +void luaG_typeerror (lua_State *L, StkId o, const char *op) { + const char *name; + const char *kind = getobjname(L, o, &name); + const char *t = luaO_typename(o); + if (kind) + luaO_verror(L, "attempt to %.30s %.20s `%.40s' (a %.10s value)", + op, kind, name, t); + else + luaO_verror(L, "attempt to %.30s a %.10s value", op, t); +} + + +void luaG_binerror (lua_State *L, StkId p1, int t, const char *op) { + if (ttype(p1) == t) p1++; + LUA_ASSERT(ttype(p1) != t, "must be an error"); + luaG_typeerror(L, p1, op); +} + + +void luaG_ordererror (lua_State *L, StkId top) { + const char *t1 = luaO_typename(top-2); + const char *t2 = luaO_typename(top-1); + if (t1[2] == t2[2]) + luaO_verror(L, "attempt to compare two %.10s values", t1); + else + luaO_verror(L, "attempt to compare %.10s with %.10s", t1, t2); +} + diff --git a/build/premake/src/Src/Lua/ldebug.h b/build/premake/src/Src/Lua/ldebug.h new file mode 100644 index 0000000000..90db8a1745 --- /dev/null +++ b/build/premake/src/Src/Lua/ldebug.h @@ -0,0 +1,21 @@ +/* +** $Id: ldebug.h,v 1.1 2003/01/24 16:26:01 jason379 Exp $ +** Auxiliary functions from Debug Interface module +** See Copyright Notice in lua.h +*/ + +#ifndef ldebug_h +#define ldebug_h + + +#include "lstate.h" +#include "luadebug.h" + + +void luaG_typeerror (lua_State *L, StkId o, const char *op); +void luaG_binerror (lua_State *L, StkId p1, int t, const char *op); +int luaG_getline (int *lineinfo, int pc, int refline, int *refi); +void luaG_ordererror (lua_State *L, StkId top); + + +#endif diff --git a/build/premake/src/Src/Lua/ldo.c b/build/premake/src/Src/Lua/ldo.c new file mode 100644 index 0000000000..a37f988a8c --- /dev/null +++ b/build/premake/src/Src/Lua/ldo.c @@ -0,0 +1,388 @@ +/* +** $Id: ldo.c,v 1.1 2003/01/24 16:26:02 jason379 Exp $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" +#include "lzio.h" + + +/* space to handle stack overflow errors */ +#define EXTRA_STACK (2*LUA_MINSTACK) + + +void luaD_init (lua_State *L, int stacksize) { + L->stack = luaM_newvector(L, stacksize+EXTRA_STACK, TObject); + L->nblocks += stacksize*sizeof(TObject); + L->stack_last = L->stack+(stacksize-1); + L->stacksize = stacksize; + L->Cbase = L->top = L->stack; +} + + +void luaD_checkstack (lua_State *L, int n) { + if (L->stack_last - L->top <= n) { /* stack overflow? */ + if (L->stack_last-L->stack > (L->stacksize-1)) { + /* overflow while handling overflow */ + luaD_breakrun(L, LUA_ERRERR); /* break run without error message */ + } + else { + L->stack_last += EXTRA_STACK; /* to be used by error message */ + lua_error(L, "stack overflow"); + } + } +} + + +static void restore_stack_limit (lua_State *L) { + if (L->top - L->stack < L->stacksize - 1) + L->stack_last = L->stack + (L->stacksize-1); +} + + +/* +** Adjust stack. Set top to base+extra, pushing NILs if needed. +** (we cannot add base+extra unless we are sure it fits in the stack; +** otherwise the result of such operation on pointers is undefined) +*/ +void luaD_adjusttop (lua_State *L, StkId base, int extra) { + int diff = extra-(L->top-base); + if (diff <= 0) + L->top = base+extra; + else { + luaD_checkstack(L, diff); + while (diff--) + ttype(L->top++) = LUA_TNIL; + } +} + + +/* +** Open a hole inside the stack at `pos' +*/ +static void luaD_openstack (lua_State *L, StkId pos) { + int i = L->top-pos; + while (i--) pos[i+1] = pos[i]; + incr_top; +} + + +static void dohook (lua_State *L, lua_Debug *ar, lua_Hook hook) { + StkId old_Cbase = L->Cbase; + StkId old_top = L->Cbase = L->top; + luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ + L->allowhooks = 0; /* cannot call hooks inside a hook */ + (*hook)(L, ar); + LUA_ASSERT(L->allowhooks == 0, "invalid allow"); + L->allowhooks = 1; + L->top = old_top; + L->Cbase = old_Cbase; +} + + +void luaD_lineHook (lua_State *L, StkId func, int line, lua_Hook linehook) { + if (L->allowhooks) { + lua_Debug ar; + ar._func = func; + ar.event = "line"; + ar.currentline = line; + dohook(L, &ar, linehook); + } +} + + +static void luaD_callHook (lua_State *L, StkId func, lua_Hook callhook, + const char *event) { + if (L->allowhooks) { + lua_Debug ar; + ar._func = func; + ar.event = event; + infovalue(func)->pc = NULL; /* function is not active */ + dohook(L, &ar, callhook); + } +} + + +static StkId callCclosure (lua_State *L, const struct Closure *cl, StkId base) { + int nup = cl->nupvalues; /* number of upvalues */ + StkId old_Cbase = L->Cbase; + int n; + L->Cbase = base; /* new base for C function */ + luaD_checkstack(L, nup+LUA_MINSTACK); /* ensure minimum stack size */ + for (n=0; ntop++) = cl->upvalue[n]; + n = (*cl->f.c)(L); /* do the actual call */ + L->Cbase = old_Cbase; /* restore old C base */ + return L->top - n; /* return index of first result */ +} + + +void luaD_callTM (lua_State *L, Closure *f, int nParams, int nResults) { + StkId base = L->top - nParams; + luaD_openstack(L, base); + clvalue(base) = f; + ttype(base) = LUA_TFUNCTION; + luaD_call(L, base, nResults); +} + + +/* +** Call a function (C or Lua). The function to be called is at *func. +** The arguments are on the stack, right after the function. +** When returns, the results are on the stack, starting at the original +** function position. +** The number of results is nResults, unless nResults=LUA_MULTRET. +*/ +void luaD_call (lua_State *L, StkId func, int nResults) { + lua_Hook callhook; + StkId firstResult; + CallInfo ci; + Closure *cl; + if (ttype(func) != LUA_TFUNCTION) { + /* `func' is not a function; check the `function' tag method */ + Closure *tm = luaT_gettmbyObj(L, func, TM_FUNCTION); + if (tm == NULL) + luaG_typeerror(L, func, "call"); + luaD_openstack(L, func); + clvalue(func) = tm; /* tag method is the new function to be called */ + ttype(func) = LUA_TFUNCTION; + } + cl = clvalue(func); + ci.func = cl; + infovalue(func) = &ci; + ttype(func) = LUA_TMARK; + callhook = L->callhook; + if (callhook) + luaD_callHook(L, func, callhook, "call"); + firstResult = (cl->isC ? callCclosure(L, cl, func+1) : + luaV_execute(L, cl, func+1)); + if (callhook) /* same hook that was active at entry */ + luaD_callHook(L, func, callhook, "return"); + LUA_ASSERT(ttype(func) == LUA_TMARK, "invalid tag"); + /* move results to `func' (to erase parameters and function) */ + if (nResults == LUA_MULTRET) { + while (firstResult < L->top) /* copy all results */ + *func++ = *firstResult++; + L->top = func; + } + else { /* copy at most `nResults' */ + for (; nResults > 0 && firstResult < L->top; nResults--) + *func++ = *firstResult++; + L->top = func; + for (; nResults > 0; nResults--) { /* if there are not enough results */ + ttype(L->top) = LUA_TNIL; /* adjust the stack */ + incr_top; /* must check stack space */ + } + } + luaC_checkGC(L); +} + + +/* +** Execute a protected call. +*/ +struct CallS { /* data to `f_call' */ + StkId func; + int nresults; +}; + +static void f_call (lua_State *L, void *ud) { + struct CallS *c = (struct CallS *)ud; + luaD_call(L, c->func, c->nresults); +} + + +LUA_API int lua_call (lua_State *L, int nargs, int nresults) { + StkId func = L->top - (nargs+1); /* function to be called */ + struct CallS c; + int status; + c.func = func; c.nresults = nresults; + status = luaD_runprotected(L, f_call, &c); + if (status != 0) /* an error occurred? */ + L->top = func; /* remove parameters from the stack */ + return status; +} + + +/* +** Execute a protected parser. +*/ +struct ParserS { /* data to `f_parser' */ + ZIO *z; + int bin; +}; + +static void f_parser (lua_State *L, void *ud) { + struct ParserS *p = (struct ParserS *)ud; + Proto *tf = p->bin ? luaU_undump(L, p->z) : luaY_parser(L, p->z); + luaV_Lclosure(L, tf, 0); +} + + +static int protectedparser (lua_State *L, ZIO *z, int bin) { + struct ParserS p; + unsigned long old_blocks; + int status; + p.z = z; p.bin = bin; + /* before parsing, give a (good) chance to GC */ + if (L->nblocks/8 >= L->GCthreshold/10) + luaC_collectgarbage(L); + old_blocks = L->nblocks; + status = luaD_runprotected(L, f_parser, &p); + if (status == 0) { + /* add new memory to threshold (as it probably will stay) */ + L->GCthreshold += (L->nblocks - old_blocks); + } + else if (status == LUA_ERRRUN) /* an error occurred: correct error code */ + status = LUA_ERRSYNTAX; + return status; +} + + +static int parse_file (lua_State *L, const char *filename) { + ZIO z; + int status; + int bin; /* flag for file mode */ + int c; /* look ahead char */ + FILE *f = (filename == NULL) ? stdin : fopen(filename, "r"); + if (f == NULL) return LUA_ERRFILE; /* unable to open file */ + c = fgetc(f); + ungetc(c, f); + bin = (c == ID_CHUNK); + if (bin && f != stdin) { + f = freopen(filename, "rb", f); /* set binary mode */ + if (f == NULL) return LUA_ERRFILE; /* unable to reopen file */ + } + lua_pushstring(L, "@"); + lua_pushstring(L, (filename == NULL) ? "(stdin)" : filename); + lua_concat(L, 2); + c = lua_gettop(L); + filename = lua_tostring(L, c); /* filename = '@'..filename */ + luaZ_Fopen(&z, f, filename); + status = protectedparser(L, &z, bin); + lua_remove(L, c); /* remove `filename' from the stack */ + if (f != stdin) + fclose(f); + return status; +} + + +LUA_API int lua_dofile (lua_State *L, const char *filename) { + int status = parse_file(L, filename); + if (status == 0) /* parse OK? */ + status = lua_call(L, 0, LUA_MULTRET); /* call main */ + return status; +} + + +static int parse_buffer (lua_State *L, const char *buff, size_t size, + const char *name) { + ZIO z; + if (!name) name = "?"; + luaZ_mopen(&z, buff, size, name); + return protectedparser(L, &z, buff[0]==ID_CHUNK); +} + + +LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, const char *name) { + int status = parse_buffer(L, buff, size, name); + if (status == 0) /* parse OK? */ + status = lua_call(L, 0, LUA_MULTRET); /* call main */ + return status; +} + + +LUA_API int lua_dostring (lua_State *L, const char *str) { + return lua_dobuffer(L, str, strlen(str), str); +} + + +/* +** {====================================================== +** Error-recover functions (based on long jumps) +** ======================================================= +*/ + +/* chain list of long jump buffers */ +struct lua_longjmp { + jmp_buf b; + struct lua_longjmp *previous; + volatile int status; /* error code */ +}; + + +static void message (lua_State *L, const char *s) { + const TObject *em = luaH_getglobal(L, LUA_ERRORMESSAGE); + if (ttype(em) == LUA_TFUNCTION) { + *L->top = *em; + incr_top; + lua_pushstring(L, s); + luaD_call(L, L->top-2, 0); + } +} + + +/* +** Reports an error, and jumps up to the available recovery label +*/ +LUA_API void lua_error (lua_State *L, const char *s) { + if (s) message(L, s); + luaD_breakrun(L, LUA_ERRRUN); +} + + +void luaD_breakrun (lua_State *L, int errcode) { + if (L->errorJmp) { + L->errorJmp->status = errcode; + longjmp(L->errorJmp->b, 1); + } + else { + if (errcode != LUA_ERRMEM) + message(L, "unable to recover; exiting\n"); + exit(EXIT_FAILURE); + } +} + + +int luaD_runprotected (lua_State *L, void (*f)(lua_State *, void *), void *ud) { + StkId oldCbase = L->Cbase; + StkId oldtop = L->top; + struct lua_longjmp lj; + int allowhooks = L->allowhooks; + lj.status = 0; + lj.previous = L->errorJmp; /* chain new error handler */ + L->errorJmp = &lj; + if (setjmp(lj.b) == 0) + (*f)(L, ud); + else { /* an error occurred: restore the state */ + L->allowhooks = allowhooks; + L->Cbase = oldCbase; + L->top = oldtop; + restore_stack_limit(L); + } + L->errorJmp = lj.previous; /* restore old error handler */ + return lj.status; +} + +/* }====================================================== */ + diff --git a/build/premake/src/Src/Lua/ldo.h b/build/premake/src/Src/Lua/ldo.h new file mode 100644 index 0000000000..ef1c4db099 --- /dev/null +++ b/build/premake/src/Src/Lua/ldo.h @@ -0,0 +1,33 @@ +/* +** $Id: ldo.h,v 1.1 2003/01/24 16:26:03 jason379 Exp $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + +#ifndef ldo_h +#define ldo_h + + +#include "lobject.h" +#include "lstate.h" + + +/* +** macro to increment stack top. +** There must be always an empty slot at the L->stack.top +*/ +#define incr_top {if (L->top == L->stack_last) luaD_checkstack(L, 1); L->top++;} + + +void luaD_init (lua_State *L, int stacksize); +void luaD_adjusttop (lua_State *L, StkId base, int extra); +void luaD_lineHook (lua_State *L, StkId func, int line, lua_Hook linehook); +void luaD_call (lua_State *L, StkId func, int nResults); +void luaD_callTM (lua_State *L, Closure *f, int nParams, int nResults); +void luaD_checkstack (lua_State *L, int n); + +void luaD_breakrun (lua_State *L, int errcode); +int luaD_runprotected (lua_State *L, void (*f)(lua_State *, void *), void *ud); + + +#endif diff --git a/build/premake/src/Src/Lua/lfunc.c b/build/premake/src/Src/Lua/lfunc.c new file mode 100644 index 0000000000..a73759503a --- /dev/null +++ b/build/premake/src/Src/Lua/lfunc.c @@ -0,0 +1,109 @@ +/* +** $Id: lfunc.c,v 1.1 2003/01/24 16:26:03 jason379 Exp $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + + +#include + +#include "lua.h" + +#include "lfunc.h" +#include "lmem.h" +#include "lstate.h" + + +#define sizeclosure(n) ((int)sizeof(Closure) + (int)sizeof(TObject)*((n)-1)) + + +Closure *luaF_newclosure (lua_State *L, int nelems) { + int size = sizeclosure(nelems); + Closure *c = (Closure *)luaM_malloc(L, size); + c->next = L->rootcl; + L->rootcl = c; + c->mark = c; + c->nupvalues = nelems; + L->nblocks += size; + return c; +} + + +Proto *luaF_newproto (lua_State *L) { + Proto *f = luaM_new(L, Proto); + f->knum = NULL; + f->nknum = 0; + f->kstr = NULL; + f->nkstr = 0; + f->kproto = NULL; + f->nkproto = 0; + f->code = NULL; + f->ncode = 0; + f->numparams = 0; + f->is_vararg = 0; + f->maxstacksize = 0; + f->marked = 0; + f->lineinfo = NULL; + f->nlineinfo = 0; + f->nlocvars = 0; + f->locvars = NULL; + f->lineDefined = 0; + f->source = NULL; + f->next = L->rootproto; /* chain in list of protos */ + L->rootproto = f; + return f; +} + + +static size_t protosize (Proto *f) { + return sizeof(Proto) + + f->nknum*sizeof(Number) + + f->nkstr*sizeof(TString *) + + f->nkproto*sizeof(Proto *) + + f->ncode*sizeof(Instruction) + + f->nlocvars*sizeof(struct LocVar) + + f->nlineinfo*sizeof(int); +} + + +void luaF_protook (lua_State *L, Proto *f, int pc) { + f->ncode = pc; /* signal that proto was properly created */ + L->nblocks += protosize(f); +} + + +void luaF_freeproto (lua_State *L, Proto *f) { + if (f->ncode > 0) /* function was properly created? */ + L->nblocks -= protosize(f); + luaM_free(L, f->code); + luaM_free(L, f->locvars); + luaM_free(L, f->kstr); + luaM_free(L, f->knum); + luaM_free(L, f->kproto); + luaM_free(L, f->lineinfo); + luaM_free(L, f); +} + + +void luaF_freeclosure (lua_State *L, Closure *c) { + L->nblocks -= sizeclosure(c->nupvalues); + luaM_free(L, c); +} + + +/* +** Look for n-th local variable at line `line' in function `func'. +** Returns NULL if not found. +*/ +const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { + int i; + for (i = 0; inlocvars && f->locvars[i].startpc <= pc; i++) { + if (pc < f->locvars[i].endpc) { /* is variable active? */ + local_number--; + if (local_number == 0) + return f->locvars[i].varname->str; + } + } + return NULL; /* not found */ +} + diff --git a/build/premake/src/Src/Lua/lfunc.h b/build/premake/src/Src/Lua/lfunc.h new file mode 100644 index 0000000000..3b68b7bb3c --- /dev/null +++ b/build/premake/src/Src/Lua/lfunc.h @@ -0,0 +1,24 @@ +/* +** $Id: lfunc.h,v 1.1 2003/01/24 16:26:04 jason379 Exp $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + +#ifndef lfunc_h +#define lfunc_h + + +#include "lobject.h" + + + +Proto *luaF_newproto (lua_State *L); +void luaF_protook (lua_State *L, Proto *f, int pc); +Closure *luaF_newclosure (lua_State *L, int nelems); +void luaF_freeproto (lua_State *L, Proto *f); +void luaF_freeclosure (lua_State *L, Closure *c); + +const char *luaF_getlocalname (const Proto *func, int local_number, int pc); + + +#endif diff --git a/build/premake/src/Src/Lua/lgc.c b/build/premake/src/Src/Lua/lgc.c new file mode 100644 index 0000000000..e556fe30b7 --- /dev/null +++ b/build/premake/src/Src/Lua/lgc.c @@ -0,0 +1,353 @@ +/* +** $Id: lgc.c,v 1.1 2003/01/24 16:26:05 jason379 Exp $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#include "lua.h" + +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +typedef struct GCState { + Hash *tmark; /* list of marked tables to be visited */ + Closure *cmark; /* list of marked closures to be visited */ +} GCState; + + + +static void markobject (GCState *st, TObject *o); + + +/* mark a string; marks larger than 1 cannot be changed */ +#define strmark(s) {if ((s)->marked == 0) (s)->marked = 1;} + + + +static void protomark (Proto *f) { + if (!f->marked) { + int i; + f->marked = 1; + strmark(f->source); + for (i=0; inkstr; i++) + strmark(f->kstr[i]); + for (i=0; inkproto; i++) + protomark(f->kproto[i]); + for (i=0; inlocvars; i++) /* mark local-variable names */ + strmark(f->locvars[i].varname); + } +} + + +static void markstack (lua_State *L, GCState *st) { + StkId o; + for (o=L->stack; otop; o++) + markobject(st, o); +} + + +static void marklock (lua_State *L, GCState *st) { + int i; + for (i=0; irefSize; i++) { + if (L->refArray[i].st == LOCK) + markobject(st, &L->refArray[i].o); + } +} + + +static void markclosure (GCState *st, Closure *cl) { + if (!ismarked(cl)) { + if (!cl->isC) + protomark(cl->f.l); + cl->mark = st->cmark; /* chain it for later traversal */ + st->cmark = cl; + } +} + + +static void marktagmethods (lua_State *L, GCState *st) { + int e; + for (e=0; elast_tag; t++) { + Closure *cl = luaT_gettm(L, t, e); + if (cl) markclosure(st, cl); + } + } +} + + +static void markobject (GCState *st, TObject *o) { + switch (ttype(o)) { + case LUA_TUSERDATA: case LUA_TSTRING: + strmark(tsvalue(o)); + break; + case LUA_TMARK: + markclosure(st, infovalue(o)->func); + break; + case LUA_TFUNCTION: + markclosure(st, clvalue(o)); + break; + case LUA_TTABLE: { + if (!ismarked(hvalue(o))) { + hvalue(o)->mark = st->tmark; /* chain it in list of marked */ + st->tmark = hvalue(o); + } + break; + } + default: break; /* numbers, etc */ + } +} + + +static void markall (lua_State *L) { + GCState st; + st.cmark = NULL; + st.tmark = L->gt; /* put table of globals in mark list */ + L->gt->mark = NULL; + marktagmethods(L, &st); /* mark tag methods */ + markstack(L, &st); /* mark stack objects */ + marklock(L, &st); /* mark locked objects */ + for (;;) { /* mark tables and closures */ + if (st.cmark) { + int i; + Closure *f = st.cmark; /* get first closure from list */ + st.cmark = f->mark; /* remove it from list */ + for (i=0; inupvalues; i++) /* mark its upvalues */ + markobject(&st, &f->upvalue[i]); + } + else if (st.tmark) { + int i; + Hash *h = st.tmark; /* get first table from list */ + st.tmark = h->mark; /* remove it from list */ + for (i=0; isize; i++) { + Node *n = node(h, i); + if (ttype(key(n)) != LUA_TNIL) { + if (ttype(val(n)) == LUA_TNIL) + luaH_remove(h, key(n)); /* dead element; try to remove it */ + markobject(&st, &n->key); + markobject(&st, &n->val); + } + } + } + else break; /* nothing else to mark */ + } +} + + +static int hasmark (const TObject *o) { + /* valid only for locked objects */ + switch (o->ttype) { + case LUA_TSTRING: case LUA_TUSERDATA: + return tsvalue(o)->marked; + case LUA_TTABLE: + return ismarked(hvalue(o)); + case LUA_TFUNCTION: + return ismarked(clvalue(o)); + default: /* number */ + return 1; + } +} + + +/* macro for internal debugging; check if a link of free refs is valid */ +#define VALIDLINK(L, st,n) (NONEXT <= (st) && (st) < (n)) + +static void invalidaterefs (lua_State *L) { + int n = L->refSize; + int i; + for (i=0; irefArray[i]; + if (r->st == HOLD && !hasmark(&r->o)) + r->st = COLLECTED; + LUA_ASSERT((r->st == LOCK && hasmark(&r->o)) || + (r->st == HOLD && hasmark(&r->o)) || + r->st == COLLECTED || + r->st == NONEXT || + (r->st < n && VALIDLINK(L, L->refArray[r->st].st, n)), + "inconsistent ref table"); + } + LUA_ASSERT(VALIDLINK(L, L->refFree, n), "inconsistent ref table"); +} + + + +static void collectproto (lua_State *L) { + Proto **p = &L->rootproto; + Proto *next; + while ((next = *p) != NULL) { + if (next->marked) { + next->marked = 0; + p = &next->next; + } + else { + *p = next->next; + luaF_freeproto(L, next); + } + } +} + + +static void collectclosure (lua_State *L) { + Closure **p = &L->rootcl; + Closure *next; + while ((next = *p) != NULL) { + if (ismarked(next)) { + next->mark = next; /* unmark */ + p = &next->next; + } + else { + *p = next->next; + luaF_freeclosure(L, next); + } + } +} + + +static void collecttable (lua_State *L) { + Hash **p = &L->roottable; + Hash *next; + while ((next = *p) != NULL) { + if (ismarked(next)) { + next->mark = next; /* unmark */ + p = &next->next; + } + else { + *p = next->next; + luaH_free(L, next); + } + } +} + + +static void checktab (lua_State *L, stringtable *tb) { + if (tb->nuse < (lint32)(tb->size/4) && tb->size > 10) + luaS_resize(L, tb, tb->size/2); /* table is too big */ +} + + +static void collectstrings (lua_State *L, int all) { + int i; + for (i=0; istrt.size; i++) { /* for each list */ + TString **p = &L->strt.hash[i]; + TString *next; + while ((next = *p) != NULL) { + if (next->marked && !all) { /* preserve? */ + if (next->marked < FIXMARK) /* does not change FIXMARKs */ + next->marked = 0; + p = &next->nexthash; + } + else { /* collect */ + *p = next->nexthash; + L->strt.nuse--; + L->nblocks -= sizestring(next->len); + luaM_free(L, next); + } + } + } + checktab(L, &L->strt); +} + + +static void collectudata (lua_State *L, int all) { + int i; + for (i=0; iudt.size; i++) { /* for each list */ + TString **p = &L->udt.hash[i]; + TString *next; + while ((next = *p) != NULL) { + LUA_ASSERT(next->marked <= 1, "udata cannot be fixed"); + if (next->marked && !all) { /* preserve? */ + next->marked = 0; + p = &next->nexthash; + } + else { /* collect */ + int tag = next->u.d.tag; + *p = next->nexthash; + next->nexthash = L->TMtable[tag].collected; /* chain udata */ + L->TMtable[tag].collected = next; + L->nblocks -= sizestring(next->len); + L->udt.nuse--; + } + } + } + checktab(L, &L->udt); +} + + +#define MINBUFFER 256 +static void checkMbuffer (lua_State *L) { + if (L->Mbuffsize > MINBUFFER*2) { /* is buffer too big? */ + size_t newsize = L->Mbuffsize/2; /* still larger than MINBUFFER */ + L->nblocks += (newsize - L->Mbuffsize)*sizeof(char); + L->Mbuffsize = newsize; + luaM_reallocvector(L, L->Mbuffer, newsize, char); + } +} + + +static void callgcTM (lua_State *L, const TObject *o) { + Closure *tm = luaT_gettmbyObj(L, o, TM_GC); + if (tm != NULL) { + int oldah = L->allowhooks; + L->allowhooks = 0; /* stop debug hooks during GC tag methods */ + luaD_checkstack(L, 2); + clvalue(L->top) = tm; + ttype(L->top) = LUA_TFUNCTION; + *(L->top+1) = *o; + L->top += 2; + luaD_call(L, L->top-2, 0); + L->allowhooks = oldah; /* restore hooks */ + } +} + + +static void callgcTMudata (lua_State *L) { + int tag; + TObject o; + ttype(&o) = LUA_TUSERDATA; + L->GCthreshold = 2*L->nblocks; /* avoid GC during tag methods */ + for (tag=L->last_tag; tag>=0; tag--) { /* for each tag (in reverse order) */ + TString *udata; + while ((udata = L->TMtable[tag].collected) != NULL) { + L->TMtable[tag].collected = udata->nexthash; /* remove it from list */ + tsvalue(&o) = udata; + callgcTM(L, &o); + luaM_free(L, udata); + } + } +} + + +void luaC_collect (lua_State *L, int all) { + collectudata(L, all); + callgcTMudata(L); + collectstrings(L, all); + collecttable(L); + collectproto(L); + collectclosure(L); +} + + +void luaC_collectgarbage (lua_State *L) { + markall(L); + invalidaterefs(L); /* check unlocked references */ + luaC_collect(L, 0); + checkMbuffer(L); + L->GCthreshold = 2*L->nblocks; /* set new threshold */ + callgcTM(L, &luaO_nilobject); +} + + +void luaC_checkGC (lua_State *L) { + if (L->nblocks >= L->GCthreshold) + luaC_collectgarbage(L); +} + diff --git a/build/premake/src/Src/Lua/lgc.h b/build/premake/src/Src/Lua/lgc.h new file mode 100644 index 0000000000..58d94ce5da --- /dev/null +++ b/build/premake/src/Src/Lua/lgc.h @@ -0,0 +1,19 @@ +/* +** $Id: lgc.h,v 1.1 2003/01/24 16:26:06 jason379 Exp $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#ifndef lgc_h +#define lgc_h + + +#include "lobject.h" + + +void luaC_collect (lua_State *L, int all); +void luaC_collectgarbage (lua_State *L); +void luaC_checkGC (lua_State *L); + + +#endif diff --git a/build/premake/src/Src/Lua/liolib.c b/build/premake/src/Src/Lua/liolib.c new file mode 100644 index 0000000000..c389dc61f8 --- /dev/null +++ b/build/premake/src/Src/Lua/liolib.c @@ -0,0 +1,718 @@ +/* +** $Id: liolib.c,v 1.1 2003/04/23 12:16:05 jason379 Exp $ +** Standard I/O (and system) library +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "luadebug.h" +#include "lualib.h" + + +#ifndef OLD_ANSI +#include +#include +#define realloc(b,s) ((b) == NULL ? malloc(s) : (realloc)(b, s)) +#define free(b) if (b) (free)(b) +#else +/* no support for locale and for strerror: fake them */ +#define setlocale(a,b) ((void)a, strcmp((b),"C")==0?"C":NULL) +#define LC_ALL 0 +#define LC_COLLATE 0 +#define LC_CTYPE 0 +#define LC_MONETARY 0 +#define LC_NUMERIC 0 +#define LC_TIME 0 +#define strerror(e) "generic I/O error" +#define errno (-1) +#endif + + + +#ifdef POPEN +/* FILE *popen(); +int pclose(); */ +#define CLOSEFILE(L, f) ((pclose(f) == -1) ? fclose(f) : 0) +#else +/* no support for popen */ +#define popen(x,y) NULL /* that is, popen always fails */ +#define CLOSEFILE(L, f) (fclose(f)) +#endif + + +#define INFILE 0 +#define OUTFILE 1 + +typedef struct IOCtrl { + int ref[2]; /* ref for strings _INPUT/_OUTPUT */ + int iotag; /* tag for file handles */ + int closedtag; /* tag for closed handles */ +} IOCtrl; + + + +static const char *const filenames[] = {"_INPUT", "_OUTPUT"}; + + +static int pushresult (lua_State *L, int i) { + if (i) { + lua_pushuserdata(L, NULL); + return 1; + } + else { + lua_pushnil(L); + lua_pushstring(L, strerror(errno)); + lua_pushnumber(L, errno); + return 3;; + } +} + + +/* +** {====================================================== +** FILE Operations +** ======================================================= +*/ + + +static FILE *gethandle (lua_State *L, IOCtrl *ctrl, int f) { + void *p = lua_touserdata(L, f); + if (p != NULL) { /* is `f' a userdata ? */ + int ftag = lua_tag(L, f); + if (ftag == ctrl->iotag) /* does it have the correct tag? */ + return (FILE *)p; + else if (ftag == ctrl->closedtag) + lua_error(L, "cannot access a closed file"); + /* else go through */ + } + return NULL; +} + + +static FILE *getnonullfile (lua_State *L, IOCtrl *ctrl, int arg) { + FILE *f = gethandle(L, ctrl, arg); + luaL_arg_check(L, f, arg, "invalid file handle"); + return f; +} + + +static FILE *getfilebyref (lua_State *L, IOCtrl *ctrl, int inout) { + FILE *f; + lua_getglobals(L); + lua_getref(L, ctrl->ref[inout]); + lua_rawget(L, -2); + f = gethandle(L, ctrl, -1); + if (f == NULL) + luaL_verror(L, "global variable `%.10s' is not a file handle", + filenames[inout]); + return f; +} + + +static void setfilebyname (lua_State *L, IOCtrl *ctrl, FILE *f, + const char *name) { + lua_pushusertag(L, f, ctrl->iotag); + lua_setglobal(L, name); +} + + +#define setfile(L,ctrl,f,inout) (setfilebyname(L,ctrl,f,filenames[inout])) + + +static int setreturn (lua_State *L, IOCtrl *ctrl, FILE *f, int inout) { + if (f == NULL) + return pushresult(L, 0); + else { + setfile(L, ctrl, f, inout); + lua_pushusertag(L, f, ctrl->iotag); + return 1; + } +} + + +static int closefile (lua_State *L, IOCtrl *ctrl, FILE *f) { + if (f == stdin || f == stdout || f == stderr) + return 1; + else { + lua_pushusertag(L, f, ctrl->iotag); + lua_settag(L, ctrl->closedtag); + return (CLOSEFILE(L, f) == 0); + } +} + + +static int io_close (lua_State *L) { + IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); + lua_pop(L, 1); /* remove upvalue */ + return pushresult(L, closefile(L, ctrl, getnonullfile(L, ctrl, 1))); +} + + +static int file_collect (lua_State *L) { + IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); + FILE *f = getnonullfile(L, ctrl, 1); + if (f != stdin && f != stdout && f != stderr) + CLOSEFILE(L, f); + return 0; +} + + +static int io_open (lua_State *L) { + IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); + FILE *f; + lua_pop(L, 1); /* remove upvalue */ + f = fopen(luaL_check_string(L, 1), luaL_check_string(L, 2)); + if (f) { + lua_pushusertag(L, f, ctrl->iotag); + return 1; + } + else + return pushresult(L, 0); +} + + + +static int io_fromto (lua_State *L, int inout, const char *mode) { + IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); + FILE *current; + lua_pop(L, 1); /* remove upvalue */ + if (lua_isnull(L, 1)) { + closefile(L, ctrl, getfilebyref(L, ctrl, inout)); + current = (inout == 0) ? stdin : stdout; + } + else if (lua_tag(L, 1) == ctrl->iotag) /* deprecated option */ + current = (FILE *)lua_touserdata(L, 1); + else { + const char *s = luaL_check_string(L, 1); + current = (*s == '|') ? popen(s+1, mode) : fopen(s, mode); + } + return setreturn(L, ctrl, current, inout); +} + + +static int io_readfrom (lua_State *L) { + return io_fromto(L, INFILE, "r"); +} + + +static int io_writeto (lua_State *L) { + return io_fromto(L, OUTFILE, "w"); +} + + +static int io_appendto (lua_State *L) { + IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); + FILE *current; + lua_pop(L, 1); /* remove upvalue */ + current = fopen(luaL_check_string(L, 1), "a"); + return setreturn(L, ctrl, current, OUTFILE); +} + + + +/* +** {====================================================== +** READ +** ======================================================= +*/ + + + +#ifdef LUA_COMPAT_READPATTERN + +/* +** We cannot lookahead without need, because this can lock stdin. +** This flag signals when we need to read a next char. +*/ +#define NEED_OTHER (EOF-1) /* just some flag different from EOF */ + + +static int read_pattern (lua_State *L, FILE *f, const char *p) { + int inskip = 0; /* {skip} level */ + int c = NEED_OTHER; + luaL_Buffer b; + luaL_buffinit(L, &b); + while (*p != '\0') { + switch (*p) { + case '{': + inskip++; + p++; + continue; + case '}': + if (!inskip) lua_error(L, "unbalanced braces in read pattern"); + inskip--; + p++; + continue; + default: { + const char *ep = luaI_classend(L, p); /* get what is next */ + int m; /* match result */ + if (c == NEED_OTHER) c = getc(f); + m = (c==EOF) ? 0 : luaI_singlematch(c, p, ep); + if (m) { + if (!inskip) luaL_putchar(&b, c); + c = NEED_OTHER; + } + switch (*ep) { + case '+': /* repetition (1 or more) */ + if (!m) goto break_while; /* pattern fails? */ + /* else go through */ + case '*': /* repetition (0 or more) */ + while (m) { /* reads the same item until it fails */ + c = getc(f); + m = (c==EOF) ? 0 : luaI_singlematch(c, p, ep); + if (m && !inskip) luaL_putchar(&b, c); + } + /* go through to continue reading the pattern */ + case '?': /* optional */ + p = ep+1; /* continues reading the pattern */ + continue; + default: + if (!m) goto break_while; /* pattern fails? */ + p = ep; /* else continues reading the pattern */ + } + } + } + } break_while: + if (c != NEED_OTHER) ungetc(c, f); + luaL_pushresult(&b); /* close buffer */ + return (*p == '\0'); +} + +#else + +#define read_pattern(L, f, p) (lua_error(L, "read patterns are deprecated"), 0) + +#endif + + +static int read_number (lua_State *L, FILE *f) { + double d; + if (fscanf(f, "%lf", &d) == 1) { + lua_pushnumber(L, d); + return 1; + } + else return 0; /* read fails */ +} + + +static int read_word (lua_State *L, FILE *f) { + int c; + luaL_Buffer b; + luaL_buffinit(L, &b); + do { c = fgetc(f); } while (isspace(c)); /* skip spaces */ + while (c != EOF && !isspace(c)) { + luaL_putchar(&b, c); + c = fgetc(f); + } + ungetc(c, f); + luaL_pushresult(&b); /* close buffer */ + return (lua_strlen(L, -1) > 0); +} + + +static int read_line (lua_State *L, FILE *f) { + int n = 0; + luaL_Buffer b; + luaL_buffinit(L, &b); + for (;;) { + char *p = luaL_prepbuffer(&b); + if (!fgets(p, LUAL_BUFFERSIZE, f)) /* read fails? */ + break; + n = strlen(p); + if (p[n-1] != '\n') + luaL_addsize(&b, n); + else { + luaL_addsize(&b, n-1); /* do not add the `\n' */ + break; + } + } + luaL_pushresult(&b); /* close buffer */ + return (n > 0); /* read something? */ +} + + +static void read_file (lua_State *L, FILE *f) { + size_t len = 0; + size_t size = BUFSIZ; + char *buffer = NULL; + for (;;) { + char *newbuffer = (char *)realloc(buffer, size); + if (newbuffer == NULL) { + free(buffer); + lua_error(L, "not enough memory to read a file"); + } + buffer = newbuffer; + len += fread(buffer+len, sizeof(char), size-len, f); + if (len < size) break; /* did not read all it could */ + size *= 2; + } + lua_pushlstring(L, buffer, len); + free(buffer); +} + + +static int read_chars (lua_State *L, FILE *f, size_t n) { + char *buffer; + size_t n1; + char statbuff[BUFSIZ]; + if (n <= BUFSIZ) + buffer = statbuff; + else { + buffer = (char *)malloc(n); + if (buffer == NULL) + lua_error(L, "not enough memory to read a file"); + } + n1 = fread(buffer, sizeof(char), n, f); + lua_pushlstring(L, buffer, n1); + if (buffer != statbuff) free(buffer); + return (n1 > 0 || n == 0); +} + + +static int io_read (lua_State *L) { + IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); + int lastarg = lua_gettop(L) - 1; + int firstarg = 1; + FILE *f = gethandle(L, ctrl, firstarg); + int n; + if (f) firstarg++; + else f = getfilebyref(L, ctrl, INFILE); /* get _INPUT */ + lua_pop(L, 1); + if (firstarg > lastarg) { /* no arguments? */ + lua_settop(L, 0); /* erase upvalue and other eventual garbage */ + firstarg = lastarg = 1; /* correct indices */ + lua_pushstring(L, "*l"); /* push default argument */ + } + else /* ensure stack space for all results and for auxlib's buffer */ + luaL_checkstack(L, lastarg-firstarg+1+LUA_MINSTACK, "too many arguments"); + for (n = firstarg; n<=lastarg; n++) { + int success; + if (lua_isnumber(L, n)) + success = read_chars(L, f, (size_t)lua_tonumber(L, n)); + else { + const char *p = luaL_check_string(L, n); + if (p[0] != '*') + success = read_pattern(L, f, p); /* deprecated! */ + else { + switch (p[1]) { + case 'n': /* number */ + if (!read_number(L, f)) goto endloop; /* read fails */ + continue; /* number is already pushed; avoid the "pushstring" */ + case 'l': /* line */ + success = read_line(L, f); + break; + case 'a': /* file */ + read_file(L, f); + success = 1; /* always success */ + break; + case 'w': /* word */ + success = read_word(L, f); + break; + default: + luaL_argerror(L, n, "invalid format"); + success = 0; /* to avoid warnings */ + } + } + } + if (!success) { + lua_pop(L, 1); /* remove last result */ + break; /* read fails */ + } + } endloop: + return n - firstarg; +} + +/* }====================================================== */ + + +static int io_write (lua_State *L) { + int lastarg = lua_gettop(L) - 1; + IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); + int arg = 1; + int status = 1; + FILE *f = gethandle(L, ctrl, arg); + if (f) arg++; + else f = getfilebyref(L, ctrl, OUTFILE); /* get _OUTPUT */ + for (; arg <= lastarg; arg++) { + if (lua_type(L, arg) == LUA_TNUMBER) { /* LUA_NUMBER */ + /* optimization: could be done exactly as for strings */ + status = status && fprintf(f, "%.16g", lua_tonumber(L, arg)) > 0; + } + else { + size_t l; + const char *s = luaL_check_lstr(L, arg, &l); + status = status && (fwrite(s, sizeof(char), l, f) == l); + } + } + pushresult(L, status); + return 1; +} + + +static int io_seek (lua_State *L) { + static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; + static const char *const modenames[] = {"set", "cur", "end", NULL}; + IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); + FILE *f; + int op; + long offset; + lua_pop(L, 1); /* remove upvalue */ + f = getnonullfile(L, ctrl, 1); + op = luaL_findstring(luaL_opt_string(L, 2, "cur"), modenames); + offset = luaL_opt_long(L, 3, 0); + luaL_arg_check(L, op != -1, 2, "invalid mode"); + op = fseek(f, offset, mode[op]); + if (op) + return pushresult(L, 0); /* error */ + else { + lua_pushnumber(L, ftell(f)); + return 1; + } +} + + +static int io_flush (lua_State *L) { + IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); + FILE *f; + lua_pop(L, 1); /* remove upvalue */ + f = gethandle(L, ctrl, 1); + luaL_arg_check(L, f || lua_isnull(L, 1), 1, "invalid file handle"); + return pushresult(L, fflush(f) == 0); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Other O.S. Operations +** ======================================================= +*/ + +static int io_execute (lua_State *L) { + lua_pushnumber(L, system(luaL_check_string(L, 1))); + return 1; +} + + +static int io_remove (lua_State *L) { + return pushresult(L, remove(luaL_check_string(L, 1)) == 0); +} + + +static int io_rename (lua_State *L) { + return pushresult(L, rename(luaL_check_string(L, 1), + luaL_check_string(L, 2)) == 0); +} + + +static int io_tmpname (lua_State *L) { + lua_pushstring(L, tmpnam(NULL)); + return 1; +} + + + +static int io_getenv (lua_State *L) { + lua_pushstring(L, getenv(luaL_check_string(L, 1))); /* if NULL push nil */ + return 1; +} + + +static int io_clock (lua_State *L) { + lua_pushnumber(L, ((double)clock())/CLOCKS_PER_SEC); + return 1; +} + + +static int io_date (lua_State *L) { + char b[256]; + const char *s = luaL_opt_string(L, 1, "%c"); + struct tm *stm; + time_t t; + time(&t); stm = localtime(&t); + if (strftime(b, sizeof(b), s, stm)) + lua_pushstring(L, b); + else + lua_error(L, "invalid `date' format"); + return 1; +} + + +static int setloc (lua_State *L) { + static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, + LC_NUMERIC, LC_TIME}; + static const char *const catnames[] = {"all", "collate", "ctype", "monetary", + "numeric", "time", NULL}; + int op = luaL_findstring(luaL_opt_string(L, 2, "all"), catnames); + luaL_arg_check(L, op != -1, 2, "invalid option"); + lua_pushstring(L, setlocale(cat[op], luaL_check_string(L, 1))); + return 1; +} + + +static int io_exit (lua_State *L) { + exit(luaL_opt_int(L, 1, EXIT_SUCCESS)); + return 0; /* to avoid warnings */ +} + +/* }====================================================== */ + + + +static int io_debug (lua_State *L) { + for (;;) { + char buffer[250]; + fprintf(stderr, "lua_debug> "); + if (fgets(buffer, sizeof(buffer), stdin) == 0 || + strcmp(buffer, "cont\n") == 0) + return 0; + lua_dostring(L, buffer); + lua_settop(L, 0); /* remove eventual returns */ + } +} + + +#define LEVELS1 12 /* size of the first part of the stack */ +#define LEVELS2 10 /* size of the second part of the stack */ + +static int errorfb (lua_State *L) { + int level = 1; /* skip level 0 (it's this function) */ + int firstpart = 1; /* still before eventual `...' */ + lua_Debug ar; + luaL_Buffer b; + luaL_buffinit(L, &b); + luaL_addstring(&b, "error: "); + luaL_addstring(&b, luaL_check_string(L, 1)); + luaL_addstring(&b, "\n"); + while (lua_getstack(L, level++, &ar)) { + char buff[120]; /* enough to fit following `sprintf's */ + if (level == 2) + luaL_addstring(&b, "stack traceback:\n"); + else if (level > LEVELS1 && firstpart) { + /* no more than `LEVELS2' more levels? */ + if (!lua_getstack(L, level+LEVELS2, &ar)) + level--; /* keep going */ + else { + luaL_addstring(&b, " ...\n"); /* too many levels */ + while (lua_getstack(L, level+LEVELS2, &ar)) /* find last levels */ + level++; + } + firstpart = 0; + continue; + } + sprintf(buff, "%4d: ", level-1); + luaL_addstring(&b, buff); + lua_getinfo(L, "Snl", &ar); + switch (*ar.namewhat) { + case 'g': case 'l': /* global, local */ + sprintf(buff, "function `%.50s'", ar.name); + break; + case 'f': /* field */ + sprintf(buff, "method `%.50s'", ar.name); + break; + case 't': /* tag method */ + sprintf(buff, "`%.50s' tag method", ar.name); + break; + default: { + if (*ar.what == 'm') /* main? */ + sprintf(buff, "main of %.70s", ar.short_src); + else if (*ar.what == 'C') /* C function? */ + sprintf(buff, "%.70s", ar.short_src); + else + sprintf(buff, "function <%d:%.70s>", ar.linedefined, ar.short_src); + ar.source = NULL; /* do not print source again */ + } + } + luaL_addstring(&b, buff); + if (ar.currentline > 0) { + sprintf(buff, " at line %d", ar.currentline); + luaL_addstring(&b, buff); + } + if (ar.source) { + sprintf(buff, " [%.70s]", ar.short_src); + luaL_addstring(&b, buff); + } + luaL_addstring(&b, "\n"); + } + luaL_pushresult(&b); + lua_getglobal(L, LUA_ALERT); + if (lua_isfunction(L, -1)) { /* avoid loop if _ALERT is not defined */ + lua_pushvalue(L, -2); /* error message */ + lua_rawcall(L, 1, 0); + } + return 0; +} + + + +static const struct luaL_reg iolib[] = { + {LUA_ERRORMESSAGE, errorfb}, + {"clock", io_clock}, + {"date", io_date}, + {"debug", io_debug}, + {"execute", io_execute}, + {"exit", io_exit}, + {"getenv", io_getenv}, + {"remove", io_remove}, + {"rename", io_rename}, + {"setlocale", setloc}, + {"tmpname", io_tmpname} +}; + + +static const struct luaL_reg iolibtag[] = { + {"appendto", io_appendto}, + {"closefile", io_close}, + {"flush", io_flush}, + {"openfile", io_open}, + {"read", io_read}, + {"readfrom", io_readfrom}, + {"seek", io_seek}, + {"write", io_write}, + {"writeto", io_writeto} +}; + + +static void openwithcontrol (lua_State *L) { + IOCtrl *ctrl = (IOCtrl *)lua_newuserdata(L, sizeof(IOCtrl)); + unsigned int i; + ctrl->iotag = lua_newtag(L); + ctrl->closedtag = lua_newtag(L); + for (i=0; iref[INFILE] = lua_ref(L, 1); + lua_pushstring(L, filenames[OUTFILE]); + ctrl->ref[OUTFILE] = lua_ref(L, 1); + /* predefined file handles */ + setfile(L, ctrl, stdin, INFILE); + setfile(L, ctrl, stdout, OUTFILE); + setfilebyname(L, ctrl, stdin, "_STDIN"); + setfilebyname(L, ctrl, stdout, "_STDOUT"); + setfilebyname(L, ctrl, stderr, "_STDERR"); + /* close files when collected */ + lua_pushcclosure(L, file_collect, 1); /* pops `ctrl' from stack */ + lua_settagmethod(L, ctrl->iotag, "gc"); +} + + +LUALIB_API void lua_iolibopen (lua_State *L) { + luaL_openl(L, iolib); + openwithcontrol(L); +} + diff --git a/build/premake/src/Src/Lua/llex.c b/build/premake/src/Src/Lua/llex.c new file mode 100644 index 0000000000..1057552c79 --- /dev/null +++ b/build/premake/src/Src/Lua/llex.c @@ -0,0 +1,380 @@ +/* +** $Id: llex.c,v 1.1 2003/01/24 16:26:06 jason379 Exp $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +#include "lua.h" + +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "luadebug.h" +#include "lzio.h" + + + +#define next(LS) (LS->current = zgetc(LS->z)) + + + +/* ORDER RESERVED */ +static const char *const token2string [] = { + "and", "break", "do", "else", "elseif", "end", "for", + "function", "if", "local", "nil", "not", "or", "repeat", "return", "then", + "until", "while", "", "..", "...", "==", ">=", "<=", "~=", "", "", ""}; + + +void luaX_init (lua_State *L) { + int i; + for (i=0; imarked = (unsigned char)(RESERVEDMARK+i); /* reserved word */ + } +} + + +#define MAXSRC 80 + + +void luaX_checklimit (LexState *ls, int val, int limit, const char *msg) { + if (val > limit) { + char buff[100]; + sprintf(buff, "too many %.50s (limit=%d)", msg, limit); + luaX_error(ls, buff, ls->t.token); + } +} + + +void luaX_syntaxerror (LexState *ls, const char *s, const char *token) { + char buff[MAXSRC]; + luaO_chunkid(buff, ls->source->str, sizeof(buff)); + luaO_verror(ls->L, "%.99s;\n last token read: `%.30s' at line %d in %.80s", + s, token, ls->linenumber, buff); +} + + +void luaX_error (LexState *ls, const char *s, int token) { + char buff[TOKEN_LEN]; + luaX_token2str(token, buff); + if (buff[0] == '\0') + luaX_syntaxerror(ls, s, ls->L->Mbuffer); + else + luaX_syntaxerror(ls, s, buff); +} + + +void luaX_token2str (int token, char *s) { + if (token < 256) { + s[0] = (char)token; + s[1] = '\0'; + } + else + strcpy(s, token2string[token-FIRST_RESERVED]); +} + + +static void luaX_invalidchar (LexState *ls, int c) { + char buff[8]; + sprintf(buff, "0x%02X", c); + luaX_syntaxerror(ls, "invalid control char", buff); +} + + +static void inclinenumber (LexState *LS) { + next(LS); /* skip '\n' */ + ++LS->linenumber; + luaX_checklimit(LS, LS->linenumber, MAX_INT, "lines in a chunk"); +} + + +void luaX_setinput (lua_State *L, LexState *LS, ZIO *z, TString *source) { + LS->L = L; + LS->lookahead.token = TK_EOS; /* no look-ahead token */ + LS->z = z; + LS->fs = NULL; + LS->linenumber = 1; + LS->lastline = 1; + LS->source = source; + next(LS); /* read first char */ + if (LS->current == '#') { + do { /* skip first line */ + next(LS); + } while (LS->current != '\n' && LS->current != EOZ); + } +} + + + +/* +** ======================================================= +** LEXICAL ANALYZER +** ======================================================= +*/ + + +/* use Mbuffer to store names, literal strings and numbers */ + +#define EXTRABUFF 128 +#define checkbuffer(L, n, len) if ((len)+(n) > L->Mbuffsize) \ + luaO_openspace(L, (len)+(n)+EXTRABUFF) + +#define save(L, c, l) (L->Mbuffer[l++] = (char)c) +#define save_and_next(L, LS, l) (save(L, LS->current, l), next(LS)) + + +static const char *readname (LexState *LS) { + lua_State *L = LS->L; + size_t l = 0; + checkbuffer(L, 10, l); + do { + checkbuffer(L, 10, l); + save_and_next(L, LS, l); + } while (isalnum(LS->current) || LS->current == '_'); + save(L, '\0', l); + return L->Mbuffer; +} + + +/* LUA_NUMBER */ +static void read_number (LexState *LS, int comma, SemInfo *seminfo) { + lua_State *L = LS->L; + size_t l = 0; + checkbuffer(L, 10, l); + if (comma) save(L, '.', l); + while (isdigit(LS->current)) { + checkbuffer(L, 10, l); + save_and_next(L, LS, l); + } + if (LS->current == '.') { + save_and_next(L, LS, l); + if (LS->current == '.') { + save_and_next(L, LS, l); + save(L, '\0', l); + luaX_error(LS, "ambiguous syntax" + " (decimal point x string concatenation)", TK_NUMBER); + } + } + while (isdigit(LS->current)) { + checkbuffer(L, 10, l); + save_and_next(L, LS, l); + } + if (LS->current == 'e' || LS->current == 'E') { + save_and_next(L, LS, l); /* read 'E' */ + if (LS->current == '+' || LS->current == '-') + save_and_next(L, LS, l); /* optional exponent sign */ + while (isdigit(LS->current)) { + checkbuffer(L, 10, l); + save_and_next(L, LS, l); + } + } + save(L, '\0', l); + if (!luaO_str2d(L->Mbuffer, &seminfo->r)) + luaX_error(LS, "malformed number", TK_NUMBER); +} + + +static void read_long_string (LexState *LS, SemInfo *seminfo) { + lua_State *L = LS->L; + int cont = 0; + size_t l = 0; + checkbuffer(L, 10, l); + save(L, '[', l); /* save first '[' */ + save_and_next(L, LS, l); /* pass the second '[' */ + for (;;) { + checkbuffer(L, 10, l); + switch (LS->current) { + case EOZ: + save(L, '\0', l); + luaX_error(LS, "unfinished long string", TK_STRING); + break; /* to avoid warnings */ + case '[': + save_and_next(L, LS, l); + if (LS->current == '[') { + cont++; + save_and_next(L, LS, l); + } + continue; + case ']': + save_and_next(L, LS, l); + if (LS->current == ']') { + if (cont == 0) goto endloop; + cont--; + save_and_next(L, LS, l); + } + continue; + case '\n': + save(L, '\n', l); + inclinenumber(LS); + continue; + default: + save_and_next(L, LS, l); + } + } endloop: + save_and_next(L, LS, l); /* skip the second ']' */ + save(L, '\0', l); + seminfo->ts = luaS_newlstr(L, L->Mbuffer+2, l-5); +} + + +static void read_string (LexState *LS, int del, SemInfo *seminfo) { + lua_State *L = LS->L; + size_t l = 0; + checkbuffer(L, 10, l); + save_and_next(L, LS, l); + while (LS->current != del) { + checkbuffer(L, 10, l); + switch (LS->current) { + case EOZ: case '\n': + save(L, '\0', l); + luaX_error(LS, "unfinished string", TK_STRING); + break; /* to avoid warnings */ + case '\\': + next(LS); /* do not save the '\' */ + switch (LS->current) { + case 'a': save(L, '\a', l); next(LS); break; + case 'b': save(L, '\b', l); next(LS); break; + case 'f': save(L, '\f', l); next(LS); break; + case 'n': save(L, '\n', l); next(LS); break; + case 'r': save(L, '\r', l); next(LS); break; + case 't': save(L, '\t', l); next(LS); break; + case 'v': save(L, '\v', l); next(LS); break; + case '\n': save(L, '\n', l); inclinenumber(LS); break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': { + int c = 0; + int i = 0; + do { + c = 10*c + (LS->current-'0'); + next(LS); + } while (++i<3 && isdigit(LS->current)); + if (c != (unsigned char)c) { + save(L, '\0', l); + luaX_error(LS, "escape sequence too large", TK_STRING); + } + save(L, c, l); + break; + } + default: /* handles \\, \", \', and \? */ + save_and_next(L, LS, l); + } + break; + default: + save_and_next(L, LS, l); + } + } + save_and_next(L, LS, l); /* skip delimiter */ + save(L, '\0', l); + seminfo->ts = luaS_newlstr(L, L->Mbuffer+1, l-3); +} + + +int luaX_lex (LexState *LS, SemInfo *seminfo) { + for (;;) { + switch (LS->current) { + + case ' ': case '\t': case '\r': /* `\r' to avoid problems with DOS */ + next(LS); + continue; + + case '\n': + inclinenumber(LS); + continue; + + case '$': + luaX_error(LS, "unexpected `$' (pragmas are no longer supported)", '$'); + break; + + case '-': + next(LS); + if (LS->current != '-') return '-'; + do { next(LS); } while (LS->current != '\n' && LS->current != EOZ); + continue; + + case '[': + next(LS); + if (LS->current != '[') return '['; + else { + read_long_string(LS, seminfo); + return TK_STRING; + } + + case '=': + next(LS); + if (LS->current != '=') return '='; + else { next(LS); return TK_EQ; } + + case '<': + next(LS); + if (LS->current != '=') return '<'; + else { next(LS); return TK_LE; } + + case '>': + next(LS); + if (LS->current != '=') return '>'; + else { next(LS); return TK_GE; } + + case '~': + next(LS); + if (LS->current != '=') return '~'; + else { next(LS); return TK_NE; } + + case '"': + case '\'': + read_string(LS, LS->current, seminfo); + return TK_STRING; + + case '.': + next(LS); + if (LS->current == '.') { + next(LS); + if (LS->current == '.') { + next(LS); + return TK_DOTS; /* ... */ + } + else return TK_CONCAT; /* .. */ + } + else if (!isdigit(LS->current)) return '.'; + else { + read_number(LS, 1, seminfo); + return TK_NUMBER; + } + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + read_number(LS, 0, seminfo); + return TK_NUMBER; + + case EOZ: + return TK_EOS; + + case '_': goto tname; + + default: + if (!isalpha(LS->current)) { + int c = LS->current; + if (iscntrl(c)) + luaX_invalidchar(LS, c); + next(LS); + return c; + } + tname: { /* identifier or reserved word */ + TString *ts = luaS_new(LS->L, readname(LS)); + if (ts->marked >= RESERVEDMARK) /* reserved word? */ + return ts->marked-RESERVEDMARK+FIRST_RESERVED; + seminfo->ts = ts; + return TK_NAME; + } + } + } +} + diff --git a/build/premake/src/Src/Lua/llex.h b/build/premake/src/Src/Lua/llex.h new file mode 100644 index 0000000000..042f435e90 --- /dev/null +++ b/build/premake/src/Src/Lua/llex.h @@ -0,0 +1,72 @@ +/* +** $Id: llex.h,v 1.1 2003/01/24 16:26:06 jason379 Exp $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#ifndef llex_h +#define llex_h + +#include "lobject.h" +#include "lzio.h" + + +#define FIRST_RESERVED 257 + +/* maximum length of a reserved word (+1 for final 0) */ +#define TOKEN_LEN 15 + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER RESERVED" +*/ +enum RESERVED { + /* terminal symbols denoted by reserved words */ + TK_AND = FIRST_RESERVED, TK_BREAK, + TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FOR, TK_FUNCTION, TK_IF, TK_LOCAL, + TK_NIL, TK_NOT, TK_OR, TK_REPEAT, TK_RETURN, TK_THEN, TK_UNTIL, TK_WHILE, + /* other terminal symbols */ + TK_NAME, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER, + TK_STRING, TK_EOS +}; + +/* number of reserved words */ +#define NUM_RESERVED ((int)(TK_WHILE-FIRST_RESERVED+1)) + + +typedef union { + Number r; + TString *ts; +} SemInfo; /* semantics information */ + + +typedef struct Token { + int token; + SemInfo seminfo; +} Token; + + +typedef struct LexState { + int current; /* current character */ + Token t; /* current token */ + Token lookahead; /* look ahead token */ + struct FuncState *fs; /* `FuncState' is private to the parser */ + struct lua_State *L; + struct zio *z; /* input stream */ + int linenumber; /* input line counter */ + int lastline; /* line of last token `consumed' */ + TString *source; /* current source name */ +} LexState; + + +void luaX_init (lua_State *L); +void luaX_setinput (lua_State *L, LexState *LS, ZIO *z, TString *source); +int luaX_lex (LexState *LS, SemInfo *seminfo); +void luaX_checklimit (LexState *ls, int val, int limit, const char *msg); +void luaX_syntaxerror (LexState *ls, const char *s, const char *token); +void luaX_error (LexState *ls, const char *s, int token); +void luaX_token2str (int token, char *s); + + +#endif diff --git a/build/premake/src/Src/Lua/llimits.h b/build/premake/src/Src/Lua/llimits.h new file mode 100644 index 0000000000..05e8fabdfd --- /dev/null +++ b/build/premake/src/Src/Lua/llimits.h @@ -0,0 +1,204 @@ +/* +** $Id: llimits.h,v 1.1 2003/01/24 16:26:06 jason379 Exp $ +** Limits, basic types, and some other "installation-dependent" definitions +** See Copyright Notice in lua.h +*/ + +#ifndef llimits_h +#define llimits_h + + +#include +#include + + + +/* +** try to find number of bits in an integer +*/ +#ifndef BITS_INT +/* avoid overflows in comparison */ +#if INT_MAX-20 < 32760 +#define BITS_INT 16 +#else +#if INT_MAX > 2147483640L +/* machine has at least 32 bits */ +#define BITS_INT 32 +#else +#error "you must define BITS_INT with number of bits in an integer" +#endif +#endif +#endif + + +/* +** Define the type `number' of Lua +** GREP LUA_NUMBER to change that +*/ +#ifndef LUA_NUM_TYPE +#define LUA_NUM_TYPE double +#endif + +typedef LUA_NUM_TYPE Number; + +/* function to convert a Number to a string */ +#define NUMBER_FMT "%.16g" /* LUA_NUMBER */ +#define lua_number2str(s,n) sprintf((s), NUMBER_FMT, (n)) + +/* function to convert a string to a Number */ +#define lua_str2number(s,p) strtod((s), (p)) + + + +typedef unsigned long lint32; /* unsigned int with at least 32 bits */ + + +#define MAX_SIZET ((size_t)(~(size_t)0)-2) + + +#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ + +/* +** conversion of pointer to int (for hashing only) +** (the shift removes bits that are usually 0 because of alignment) +*/ +#define IntPoint(p) (((unsigned long)(p)) >> 3) + + + +#define MINPOWER2 4 /* minimum size for "growing" vectors */ + + + +#ifndef DEFAULT_STACK_SIZE +#define DEFAULT_STACK_SIZE 1024 +#endif + + + +/* type to ensure maximum alignment */ +union L_Umaxalign { double d; char *s; long l; }; + + + +/* +** type for virtual-machine instructions +** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) +** For a very small machine, you may change that to 2 bytes (and adjust +** the following limits accordingly) +*/ +typedef unsigned long Instruction; + + +/* +** size and position of opcode arguments. +** For an instruction with 2 bytes, size is 16, and size_b can be 5 +** (accordingly, size_u will be 10, and size_a will be 5) +*/ +#define SIZE_INSTRUCTION 32 +#define SIZE_B 9 + +#define SIZE_OP 6 +#define SIZE_U (SIZE_INSTRUCTION-SIZE_OP) +#define POS_U SIZE_OP +#define POS_B SIZE_OP +#define SIZE_A (SIZE_INSTRUCTION-(SIZE_OP+SIZE_B)) +#define POS_A (SIZE_OP+SIZE_B) + + +/* +** limits for opcode arguments. +** we use (signed) int to manipulate most arguments, +** so they must fit in BITS_INT-1 bits (-1 for sign) +*/ +#if SIZE_U < BITS_INT-1 +#define MAXARG_U ((1<>1) /* `S' is signed */ +#else +#define MAXARG_U MAX_INT +#define MAXARG_S MAX_INT +#endif + +#if SIZE_A < BITS_INT-1 +#define MAXARG_A ((1< MAXARG_B +#undef MAXSTACK +#define MAXSTACK MAXARG_B +#endif + + +/* maximum number of local variables */ +#ifndef MAXLOCALS +#define MAXLOCALS 200 /* arbitrary limit (=MAXSTACK +#undef MAXLOCALS +#define MAXLOCALS (MAXSTACK-1) +#endif + + +/* maximum number of upvalues */ +#ifndef MAXUPVALUES +#define MAXUPVALUES 32 /* arbitrary limit (<=MAXARG_B) */ +#endif +#if MAXUPVALUES>MAXARG_B +#undef MAXUPVALUES +#define MAXUPVALUES MAXARG_B +#endif + + +/* maximum number of variables in the left side of an assignment */ +#ifndef MAXVARSLH +#define MAXVARSLH 100 /* arbitrary limit (=MULT_RET +#undef MAXVARSLH +#define MAXVARSLH (MULT_RET-1) +#endif + + +/* maximum number of parameters in a function */ +#ifndef MAXPARAMS +#define MAXPARAMS 100 /* arbitrary limit (=MAXLOCALS +#undef MAXPARAMS +#define MAXPARAMS (MAXLOCALS-1) +#endif + + +/* number of list items to accumulate before a SETLIST instruction */ +#define LFIELDS_PER_FLUSH 64 +#if LFIELDS_PER_FLUSH>(MAXSTACK/4) +#undef LFIELDS_PER_FLUSH +#define LFIELDS_PER_FLUSH (MAXSTACK/4) +#endif + +/* number of record items to accumulate before a SETMAP instruction */ +/* (each item counts 2 elements on the stack: an index and a value) */ +#define RFIELDS_PER_FLUSH (LFIELDS_PER_FLUSH/2) + + +/* maximum lookback to find a real constant (for code generation) */ +#ifndef LOOKBACKNUMS +#define LOOKBACKNUMS 20 /* arbitrary constant */ +#endif + + +#endif diff --git a/build/premake/src/Src/Lua/lmathlib.c b/build/premake/src/Src/Lua/lmathlib.c new file mode 100644 index 0000000000..b893644557 --- /dev/null +++ b/build/premake/src/Src/Lua/lmathlib.c @@ -0,0 +1,238 @@ +/* +** $Id: lmathlib.c,v 1.1 2003/04/23 12:16:05 jason379 Exp $ +** Standard mathematical library +** See Copyright Notice in lua.h +*/ + + +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#undef PI +#define PI (3.14159265358979323846) +#define RADIANS_PER_DEGREE (PI/180.0) + + + +/* +** If you want Lua to operate in radians (instead of degrees), +** define RADIANS +*/ +#ifdef RADIANS +#define FROMRAD(a) (a) +#define TORAD(a) (a) +#else +#define FROMRAD(a) ((a)/RADIANS_PER_DEGREE) +#define TORAD(a) ((a)*RADIANS_PER_DEGREE) +#endif + + +static int math_abs (lua_State *L) { + lua_pushnumber(L, fabs(luaL_check_number(L, 1))); + return 1; +} + +static int math_sin (lua_State *L) { + lua_pushnumber(L, sin(TORAD(luaL_check_number(L, 1)))); + return 1; +} + +static int math_cos (lua_State *L) { + lua_pushnumber(L, cos(TORAD(luaL_check_number(L, 1)))); + return 1; +} + +static int math_tan (lua_State *L) { + lua_pushnumber(L, tan(TORAD(luaL_check_number(L, 1)))); + return 1; +} + +static int math_asin (lua_State *L) { + lua_pushnumber(L, FROMRAD(asin(luaL_check_number(L, 1)))); + return 1; +} + +static int math_acos (lua_State *L) { + lua_pushnumber(L, FROMRAD(acos(luaL_check_number(L, 1)))); + return 1; +} + +static int math_atan (lua_State *L) { + lua_pushnumber(L, FROMRAD(atan(luaL_check_number(L, 1)))); + return 1; +} + +static int math_atan2 (lua_State *L) { + lua_pushnumber(L, FROMRAD(atan2(luaL_check_number(L, 1), luaL_check_number(L, 2)))); + return 1; +} + +static int math_ceil (lua_State *L) { + lua_pushnumber(L, ceil(luaL_check_number(L, 1))); + return 1; +} + +static int math_floor (lua_State *L) { + lua_pushnumber(L, floor(luaL_check_number(L, 1))); + return 1; +} + +static int math_mod (lua_State *L) { + lua_pushnumber(L, fmod(luaL_check_number(L, 1), luaL_check_number(L, 2))); + return 1; +} + +static int math_sqrt (lua_State *L) { + lua_pushnumber(L, sqrt(luaL_check_number(L, 1))); + return 1; +} + +static int math_pow (lua_State *L) { + lua_pushnumber(L, pow(luaL_check_number(L, 1), luaL_check_number(L, 2))); + return 1; +} + +static int math_log (lua_State *L) { + lua_pushnumber(L, log(luaL_check_number(L, 1))); + return 1; +} + +static int math_log10 (lua_State *L) { + lua_pushnumber(L, log10(luaL_check_number(L, 1))); + return 1; +} + +static int math_exp (lua_State *L) { + lua_pushnumber(L, exp(luaL_check_number(L, 1))); + return 1; +} + +static int math_deg (lua_State *L) { + lua_pushnumber(L, luaL_check_number(L, 1)/RADIANS_PER_DEGREE); + return 1; +} + +static int math_rad (lua_State *L) { + lua_pushnumber(L, luaL_check_number(L, 1)*RADIANS_PER_DEGREE); + return 1; +} + +static int math_frexp (lua_State *L) { + int e; + lua_pushnumber(L, frexp(luaL_check_number(L, 1), &e)); + lua_pushnumber(L, e); + return 2; +} + +static int math_ldexp (lua_State *L) { + lua_pushnumber(L, ldexp(luaL_check_number(L, 1), luaL_check_int(L, 2))); + return 1; +} + + + +static int math_min (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + double dmin = luaL_check_number(L, 1); + int i; + for (i=2; i<=n; i++) { + double d = luaL_check_number(L, i); + if (d < dmin) + dmin = d; + } + lua_pushnumber(L, dmin); + return 1; +} + + +static int math_max (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + double dmax = luaL_check_number(L, 1); + int i; + for (i=2; i<=n; i++) { + double d = luaL_check_number(L, i); + if (d > dmax) + dmax = d; + } + lua_pushnumber(L, dmax); + return 1; +} + + +static int math_random (lua_State *L) { + /* the '%' avoids the (rare) case of r==1, and is needed also because on + some systems (SunOS!) "rand()" may return a value larger than RAND_MAX */ + double r = (double)(rand()%RAND_MAX) / (double)RAND_MAX; + switch (lua_gettop(L)) { /* check number of arguments */ + case 0: { /* no arguments */ + lua_pushnumber(L, r); /* Number between 0 and 1 */ + break; + } + case 1: { /* only upper limit */ + int u = luaL_check_int(L, 1); + luaL_arg_check(L, 1<=u, 1, "interval is empty"); + lua_pushnumber(L, (int)(r*u)+1); /* integer between 1 and `u' */ + break; + } + case 2: { /* lower and upper limits */ + int l = luaL_check_int(L, 1); + int u = luaL_check_int(L, 2); + luaL_arg_check(L, l<=u, 2, "interval is empty"); + lua_pushnumber(L, (int)(r*(u-l+1))+l); /* integer between `l' and `u' */ + break; + } + default: lua_error(L, "wrong number of arguments"); + } + return 1; +} + + +static int math_randomseed (lua_State *L) { + srand(luaL_check_int(L, 1)); + return 0; +} + + +static const struct luaL_reg mathlib[] = { +{"abs", math_abs}, +{"sin", math_sin}, +{"cos", math_cos}, +{"tan", math_tan}, +{"asin", math_asin}, +{"acos", math_acos}, +{"atan", math_atan}, +{"atan2", math_atan2}, +{"ceil", math_ceil}, +{"floor", math_floor}, +{"mod", math_mod}, +{"frexp", math_frexp}, +{"ldexp", math_ldexp}, +{"sqrt", math_sqrt}, +{"min", math_min}, +{"max", math_max}, +{"log", math_log}, +{"log10", math_log10}, +{"exp", math_exp}, +{"deg", math_deg}, +{"rad", math_rad}, +{"random", math_random}, +{"randomseed", math_randomseed} +}; + +/* +** Open math library +*/ +LUALIB_API void lua_mathlibopen (lua_State *L) { + luaL_openl(L, mathlib); + lua_pushcfunction(L, math_pow); + lua_settagmethod(L, LUA_TNUMBER, "pow"); + lua_pushnumber(L, PI); + lua_setglobal(L, "PI"); +} + diff --git a/build/premake/src/Src/Lua/lmem.c b/build/premake/src/Src/Lua/lmem.c new file mode 100644 index 0000000000..60fe29477b --- /dev/null +++ b/build/premake/src/Src/Lua/lmem.c @@ -0,0 +1,150 @@ +/* +** $Id: lmem.c,v 1.1 2003/01/24 16:26:06 jason379 Exp $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + + +#include + +#include "lua.h" + +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + + +#ifdef LUA_DEBUG +/* +** {====================================================================== +** Controlled version for realloc. +** ======================================================================= +*/ + + +#include +#include +#include + +#define realloc(b, s) debug_realloc(b, s) +#define malloc(b) debug_realloc(NULL, b) +#define free(b) debug_realloc(b, 0) + + +/* ensures maximum alignment for HEADER */ +#define HEADER (sizeof(union L_Umaxalign)) + +#define MARKSIZE 16 +#define MARK 0x55 /* 01010101 (a nice pattern) */ + + +#define blocksize(b) ((unsigned long *)((char *)(b) - HEADER)) + +unsigned long memdebug_numblocks = 0; +unsigned long memdebug_total = 0; +unsigned long memdebug_maxmem = 0; +unsigned long memdebug_memlimit = LONG_MAX; + + +static void *checkblock (void *block) { + unsigned long *b = blocksize(block); + unsigned long size = *b; + int i; + for (i=0;i memdebug_memlimit) + return NULL; /* to test memory allocation errors */ + else { + size_t realsize = HEADER+size+MARKSIZE; + char *newblock = (char *)(malloc)(realsize); /* alloc a new block */ + int i; + if (realsize < size) return NULL; /* overflow! */ + if (newblock == NULL) return NULL; + if (block) { + size_t oldsize = *blocksize(block); + if (oldsize > size) oldsize = size; + memcpy(newblock+HEADER, block, oldsize); + freeblock(block); /* erase (and check) old copy */ + } + memdebug_total += size; + if (memdebug_total > memdebug_maxmem) memdebug_maxmem = memdebug_total; + memdebug_numblocks++; + *(unsigned long *)newblock = size; + for (i=0;i= limit-inc) lua_error(L, errormsg); + if ((newn ^ nelems) <= nelems || /* still the same power-of-2 limit? */ + (nelems > 0 && newn < MINPOWER2)) /* or block already is MINPOWER2? */ + return block; /* do not need to reallocate */ + else /* it crossed a power-of-2 boundary; grow to next power */ + return luaM_realloc(L, block, luaO_power2(newn)*size); +} + + +/* +** generic allocation routine. +*/ +void *luaM_realloc (lua_State *L, void *block, lint32 size) { + if (size == 0) { + free(block); /* block may be NULL; that is OK for free */ + return NULL; + } + else if (size >= MAX_SIZET) + lua_error(L, "memory allocation error: block too big"); + block = realloc(block, size); + if (block == NULL) { + if (L) + luaD_breakrun(L, LUA_ERRMEM); /* break run without error message */ + else return NULL; /* error before creating state! */ + } + return block; +} + + diff --git a/build/premake/src/Src/Lua/lmem.h b/build/premake/src/Src/Lua/lmem.h new file mode 100644 index 0000000000..14ae7bc643 --- /dev/null +++ b/build/premake/src/Src/Lua/lmem.h @@ -0,0 +1,42 @@ +/* +** $Id: lmem.h,v 1.1 2003/01/24 16:26:07 jason379 Exp $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#ifndef lmem_h +#define lmem_h + + +#include + +#include "llimits.h" +#include "lua.h" + +void *luaM_realloc (lua_State *L, void *oldblock, lint32 size); +void *luaM_growaux (lua_State *L, void *block, size_t nelems, + int inc, size_t size, const char *errormsg, + size_t limit); + +#define luaM_free(L, b) luaM_realloc(L, (b), 0) +#define luaM_malloc(L, t) luaM_realloc(L, NULL, (t)) +#define luaM_new(L, t) ((t *)luaM_malloc(L, sizeof(t))) +#define luaM_newvector(L, n,t) ((t *)luaM_malloc(L, (n)*(lint32)sizeof(t))) + +#define luaM_growvector(L, v,nelems,inc,t,e,l) \ + ((v)=(t *)luaM_growaux(L, v,nelems,inc,sizeof(t),e,l)) + +#define luaM_reallocvector(L, v,n,t) \ + ((v)=(t *)luaM_realloc(L, v,(n)*(lint32)sizeof(t))) + + +#ifdef LUA_DEBUG +extern unsigned long memdebug_numblocks; +extern unsigned long memdebug_total; +extern unsigned long memdebug_maxmem; +extern unsigned long memdebug_memlimit; +#endif + + +#endif + diff --git a/build/premake/src/Src/Lua/lobject.c b/build/premake/src/Src/Lua/lobject.c new file mode 100644 index 0000000000..de8438285c --- /dev/null +++ b/build/premake/src/Src/Lua/lobject.c @@ -0,0 +1,125 @@ +/* +** $Id: lobject.c,v 1.1 2003/01/24 16:26:09 jason379 Exp $ +** Some generic functions over Lua objects +** See Copyright Notice in lua.h +*/ + +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +const TObject luaO_nilobject = {LUA_TNIL, {NULL}}; + + +const char *const luaO_typenames[] = { + "userdata", "nil", "number", "string", "table", "function" +}; + + + +/* +** returns smaller power of 2 larger than `n' (minimum is MINPOWER2) +*/ +lint32 luaO_power2 (lint32 n) { + lint32 p = MINPOWER2; + while (p<=n) p<<=1; + return p; +} + + +int luaO_equalObj (const TObject *t1, const TObject *t2) { + if (ttype(t1) != ttype(t2)) return 0; + switch (ttype(t1)) { + case LUA_TNUMBER: + return nvalue(t1) == nvalue(t2); + case LUA_TSTRING: case LUA_TUSERDATA: + return tsvalue(t1) == tsvalue(t2); + case LUA_TTABLE: + return hvalue(t1) == hvalue(t2); + case LUA_TFUNCTION: + return clvalue(t1) == clvalue(t2); + default: + LUA_ASSERT(ttype(t1) == LUA_TNIL, "invalid type"); + return 1; /* LUA_TNIL */ + } +} + + +char *luaO_openspace (lua_State *L, size_t n) { + if (n > L->Mbuffsize) { + luaM_reallocvector(L, L->Mbuffer, n, char); + L->nblocks += (n - L->Mbuffsize)*sizeof(char); + L->Mbuffsize = n; + } + return L->Mbuffer; +} + + +int luaO_str2d (const char *s, Number *result) { /* LUA_NUMBER */ + char *endptr; + Number res = lua_str2number(s, &endptr); + if (endptr == s) return 0; /* no conversion */ + while (isspace((unsigned char)*endptr)) endptr++; + if (*endptr != '\0') return 0; /* invalid trailing characters? */ + *result = res; + return 1; +} + + +/* maximum length of a string format for `luaO_verror' */ +#define MAX_VERROR 280 + +/* this function needs to handle only '%d' and '%.XXs' formats */ +void luaO_verror (lua_State *L, const char *fmt, ...) { + va_list argp; + char buff[MAX_VERROR]; /* to hold formatted message */ + va_start(argp, fmt); + vsprintf(buff, fmt, argp); + va_end(argp); + lua_error(L, buff); +} + + +void luaO_chunkid (char *out, const char *source, int bufflen) { + if (*source == '=') { + strncpy(out, source+1, bufflen); /* remove first char */ + out[bufflen-1] = '\0'; /* ensures null termination */ + } + else { + if (*source == '@') { + int l; + source++; /* skip the `@' */ + bufflen -= sizeof("file `...%s'"); + l = strlen(source); + if (l>bufflen) { + source += (l-bufflen); /* get last part of file name */ + sprintf(out, "file `...%.99s'", source); + } + else + sprintf(out, "file `%.99s'", source); + } + else { + int len = strcspn(source, "\n"); /* stop at first newline */ + bufflen -= sizeof("string \"%.*s...\""); + if (len > bufflen) len = bufflen; + if (source[len] != '\0') { /* must truncate? */ + strcpy(out, "string \""); + out += strlen(out); + strncpy(out, source, len); + strcpy(out+len, "...\""); + } + else + sprintf(out, "string \"%.99s\"", source); + } + } +} diff --git a/build/premake/src/Src/Lua/lobject.h b/build/premake/src/Src/Lua/lobject.h new file mode 100644 index 0000000000..8d46d5ee18 --- /dev/null +++ b/build/premake/src/Src/Lua/lobject.h @@ -0,0 +1,204 @@ +/* +** $Id: lobject.h,v 1.1 2003/01/24 16:26:09 jason379 Exp $ +** Type definitions for Lua objects +** See Copyright Notice in lua.h +*/ + +#ifndef lobject_h +#define lobject_h + + +#include "llimits.h" +#include "lua.h" + + +#ifdef LUA_DEBUG +#undef NDEBUG +#include +#define LUA_INTERNALERROR(s) assert(((void)s,0)) +#define LUA_ASSERT(c,s) assert(((void)s,(c))) +#else +#define LUA_INTERNALERROR(s) /* empty */ +#define LUA_ASSERT(c,s) /* empty */ +#endif + + +#ifdef LUA_DEBUG +/* to avoid warnings, and make sure value is really unused */ +#define UNUSED(x) (x=0, (void)(x)) +#else +#define UNUSED(x) ((void)(x)) /* to avoid warnings */ +#endif + + +/* mark for closures active in the stack */ +#define LUA_TMARK 6 + + +/* tags for values visible from Lua == first user-created tag */ +#define NUM_TAGS 6 + + +/* check whether `t' is a mark */ +#define is_T_MARK(t) ((t) == LUA_TMARK) + + +typedef union { + struct TString *ts; /* LUA_TSTRING, LUA_TUSERDATA */ + struct Closure *cl; /* LUA_TFUNCTION */ + struct Hash *a; /* LUA_TTABLE */ + struct CallInfo *i; /* LUA_TLMARK */ + Number n; /* LUA_TNUMBER */ +} Value; + + +/* Macros to access values */ +#define ttype(o) ((o)->ttype) +#define nvalue(o) ((o)->value.n) +#define tsvalue(o) ((o)->value.ts) +#define clvalue(o) ((o)->value.cl) +#define hvalue(o) ((o)->value.a) +#define infovalue(o) ((o)->value.i) +#define svalue(o) (tsvalue(o)->str) + + +typedef struct lua_TObject { + int ttype; + Value value; +} TObject; + + +/* +** String headers for string table +*/ + +/* +** most `malloc' libraries allocate memory in blocks of 8 bytes. TSPACK +** tries to make sizeof(TString) a multiple of this granularity, to reduce +** waste of space. +*/ +#define TSPACK ((int)sizeof(int)) + +typedef struct TString { + union { + struct { /* for strings */ + unsigned long hash; + int constindex; /* hint to reuse constants */ + } s; + struct { /* for userdata */ + int tag; + void *value; + } d; + } u; + size_t len; + struct TString *nexthash; /* chain for hash table */ + int marked; + char str[TSPACK]; /* variable length string!! must be the last field! */ +} TString; + + +/* +** Function Prototypes +*/ +typedef struct Proto { + Number *knum; /* Number numbers used by the function */ + int nknum; /* size of `knum' */ + struct TString **kstr; /* strings used by the function */ + int nkstr; /* size of `kstr' */ + struct Proto **kproto; /* functions defined inside the function */ + int nkproto; /* size of `kproto' */ + Instruction *code; + int ncode; /* size of `code'; when 0 means an incomplete `Proto' */ + short numparams; + short is_vararg; + short maxstacksize; + short marked; + struct Proto *next; + /* debug information */ + int *lineinfo; /* map from opcodes to source lines */ + int nlineinfo; /* size of `lineinfo' */ + int nlocvars; + struct LocVar *locvars; /* information about local variables */ + int lineDefined; + TString *source; +} Proto; + + +typedef struct LocVar { + TString *varname; + int startpc; /* first point where variable is active */ + int endpc; /* first point where variable is dead */ +} LocVar; + + +/* +** Closures +*/ +typedef struct Closure { + union { + lua_CFunction c; /* C functions */ + struct Proto *l; /* Lua functions */ + } f; + struct Closure *next; + struct Closure *mark; /* marked closures (point to itself when not marked) */ + short isC; /* 0 for Lua functions, 1 for C functions */ + short nupvalues; + TObject upvalue[1]; +} Closure; + + +#define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->isC) + + +typedef struct Node { + TObject key; + TObject val; + struct Node *next; /* for chaining */ +} Node; + +typedef struct Hash { + Node *node; + int htag; + int size; + Node *firstfree; /* this position is free; all positions after it are full */ + struct Hash *next; + struct Hash *mark; /* marked tables (point to itself when not marked) */ +} Hash; + + +/* unmarked tables and closures are represented by pointing `mark' to +** themselves +*/ +#define ismarked(x) ((x)->mark != (x)) + + +/* +** informations about a call (for debugging) +*/ +typedef struct CallInfo { + struct Closure *func; /* function being called */ + const Instruction **pc; /* current pc of called function */ + int lastpc; /* last pc traced */ + int line; /* current line */ + int refi; /* current index in `lineinfo' */ +} CallInfo; + + +extern const TObject luaO_nilobject; +extern const char *const luaO_typenames[]; + + +#define luaO_typename(o) (luaO_typenames[ttype(o)]) + + +lint32 luaO_power2 (lint32 n); +char *luaO_openspace (lua_State *L, size_t n); + +int luaO_equalObj (const TObject *t1, const TObject *t2); +int luaO_str2d (const char *s, Number *result); + +void luaO_verror (lua_State *L, const char *fmt, ...); +void luaO_chunkid (char *out, const char *source, int len); + + +#endif diff --git a/build/premake/src/Src/Lua/lopcodes.h b/build/premake/src/Src/Lua/lopcodes.h new file mode 100644 index 0000000000..9213c26918 --- /dev/null +++ b/build/premake/src/Src/Lua/lopcodes.h @@ -0,0 +1,168 @@ +/* +** $Id: lopcodes.h,v 1.1 2003/01/24 16:26:10 jason379 Exp $ +** Opcodes for Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lopcodes_h +#define lopcodes_h + +#include "llimits.h" + + +/*=========================================================================== + We assume that instructions are unsigned numbers. + All instructions have an opcode in the first 6 bits. Moreover, + an instruction can have 0, 1, or 2 arguments. Instructions can + have the following types: + type 0: no arguments + type 1: 1 unsigned argument in the higher bits (called `U') + type 2: 1 signed argument in the higher bits (`S') + type 3: 1st unsigned argument in the higher bits (`A') + 2nd unsigned argument in the middle bits (`B') + + A signed argument is represented in excess K; that is, the number + value is the unsigned value minus K. K is exactly the maximum value + for that argument (so that -max is represented by 0, and +max is + represented by 2*max), which is half the maximum for the corresponding + unsigned argument. + + The size of each argument is defined in `llimits.h'. The usual is an + instruction with 32 bits, U arguments with 26 bits (32-6), B arguments + with 9 bits, and A arguments with 17 bits (32-6-9). For small + installations, the instruction size can be 16, so U has 10 bits, + and A and B have 5 bits each. +===========================================================================*/ + + + + +/* creates a mask with `n' 1 bits at position `p' */ +#define MASK1(n,p) ((~((~(Instruction)0)<>POS_U)) +#define SETARG_U(i,u) ((i) = (((i)&MASK0(SIZE_U,POS_U)) | \ + ((Instruction)(u)<>POS_A)) +#define SETARG_A(i,a) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \ + ((Instruction)(a)<>POS_B) & MASK1(SIZE_B,0))) +#define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \ + ((Instruction)(b)<y)? PC+=s */ +OP_JMPGE,/* J y x - (x>=y)? PC+=s */ + +OP_JMPT,/* J x - (x~=nil)? PC+=s */ +OP_JMPF,/* J x - (x==nil)? PC+=s */ +OP_JMPONT,/* J x (x~=nil)? x : - (x~=nil)? PC+=s */ +OP_JMPONF,/* J x (x==nil)? x : - (x==nil)? PC+=s */ +OP_JMP,/* J - - PC+=s */ + +OP_PUSHNILJMP,/* - - nil PC++; */ + +OP_FORPREP,/* J */ +OP_FORLOOP,/* J */ + +OP_LFORPREP,/* J */ +OP_LFORLOOP,/* J */ + +OP_CLOSURE/* A B v_b-v_1 closure(KPROTO[a], v_1-v_b) */ + +} OpCode; + +#define NUM_OPCODES ((int)OP_CLOSURE+1) + + +#define ISJUMP(o) (OP_JMPNE <= (o) && (o) <= OP_JMP) + + + +/* special code to fit a LUA_MULTRET inside an argB */ +#define MULT_RET 255 /* (<=MAXARG_B) */ +#if MULT_RET>MAXARG_B +#undef MULT_RET +#define MULT_RET MAXARG_B +#endif + + +#endif diff --git a/build/premake/src/Src/Lua/lparser.c b/build/premake/src/Src/Lua/lparser.c new file mode 100644 index 0000000000..faf9f2d475 --- /dev/null +++ b/build/premake/src/Src/Lua/lparser.c @@ -0,0 +1,1124 @@ +/* +** $Id: lparser.c,v 1.1 2003/01/24 16:26:11 jason379 Exp $ +** LL(1) Parser and code generator for Lua +** See Copyright Notice in lua.h +*/ + + +#include +#include + +#include "lua.h" + +#include "lcode.h" +#include "lfunc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" + + +/* +** Constructors descriptor: +** `n' indicates number of elements, and `k' signals whether +** it is a list constructor (k = 0) or a record constructor (k = 1) +** or empty (k = ';' or '}') +*/ +typedef struct Constdesc { + int n; + int k; +} Constdesc; + + +typedef struct Breaklabel { + struct Breaklabel *previous; /* chain */ + int breaklist; + int stacklevel; +} Breaklabel; + + + + +/* +** prototypes for recursive non-terminal functions +*/ +static void body (LexState *ls, int needself, int line); +static void chunk (LexState *ls); +static void constructor (LexState *ls); +static void expr (LexState *ls, expdesc *v); +static void exp1 (LexState *ls); + + + +static void next (LexState *ls) { + ls->lastline = ls->linenumber; + if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ + ls->t = ls->lookahead; /* use this one */ + ls->lookahead.token = TK_EOS; /* and discharge it */ + } + else + ls->t.token = luaX_lex(ls, &ls->t.seminfo); /* read next token */ +} + + +static void lookahead (LexState *ls) { + LUA_ASSERT(ls->lookahead.token == TK_EOS, "two look-aheads"); + ls->lookahead.token = luaX_lex(ls, &ls->lookahead.seminfo); +} + + +static void error_expected (LexState *ls, int token) { + char buff[100], t[TOKEN_LEN]; + luaX_token2str(token, t); + sprintf(buff, "`%.20s' expected", t); + luaK_error(ls, buff); +} + + +static void check (LexState *ls, int c) { + if (ls->t.token != c) + error_expected(ls, c); + next(ls); +} + + +static void check_condition (LexState *ls, int c, const char *msg) { + if (!c) luaK_error(ls, msg); +} + + +static int optional (LexState *ls, int c) { + if (ls->t.token == c) { + next(ls); + return 1; + } + else return 0; +} + + +static void check_match (LexState *ls, int what, int who, int where) { + if (ls->t.token != what) { + if (where == ls->linenumber) + error_expected(ls, what); + else { + char buff[100]; + char t_what[TOKEN_LEN], t_who[TOKEN_LEN]; + luaX_token2str(what, t_what); + luaX_token2str(who, t_who); + sprintf(buff, "`%.20s' expected (to close `%.20s' at line %d)", + t_what, t_who, where); + luaK_error(ls, buff); + } + } + next(ls); +} + + +static int string_constant (FuncState *fs, TString *s) { + Proto *f = fs->f; + int c = s->u.s.constindex; + if (c >= f->nkstr || f->kstr[c] != s) { + luaM_growvector(fs->L, f->kstr, f->nkstr, 1, TString *, + "constant table overflow", MAXARG_U); + c = f->nkstr++; + f->kstr[c] = s; + s->u.s.constindex = c; /* hint for next time */ + } + return c; +} + + +static void code_string (LexState *ls, TString *s) { + luaK_kstr(ls, string_constant(ls->fs, s)); +} + + +static TString *str_checkname (LexState *ls) { + TString *ts; + check_condition(ls, (ls->t.token == TK_NAME), " expected"); + ts = ls->t.seminfo.ts; + next(ls); + return ts; +} + + +static int checkname (LexState *ls) { + return string_constant(ls->fs, str_checkname(ls)); +} + + +static int luaI_registerlocalvar (LexState *ls, TString *varname) { + Proto *f = ls->fs->f; + luaM_growvector(ls->L, f->locvars, f->nlocvars, 1, LocVar, "", MAX_INT); + f->locvars[f->nlocvars].varname = varname; + return f->nlocvars++; +} + + +static void new_localvar (LexState *ls, TString *name, int n) { + FuncState *fs = ls->fs; + luaX_checklimit(ls, fs->nactloc+n+1, MAXLOCALS, "local variables"); + fs->actloc[fs->nactloc+n] = luaI_registerlocalvar(ls, name); +} + + +static void adjustlocalvars (LexState *ls, int nvars) { + FuncState *fs = ls->fs; + while (nvars--) + fs->f->locvars[fs->actloc[fs->nactloc++]].startpc = fs->pc; +} + + +static void removelocalvars (LexState *ls, int nvars) { + FuncState *fs = ls->fs; + while (nvars--) + fs->f->locvars[fs->actloc[--fs->nactloc]].endpc = fs->pc; +} + + +static void new_localvarstr (LexState *ls, const char *name, int n) { + new_localvar(ls, luaS_newfixed(ls->L, name), n); +} + + +static int search_local (LexState *ls, TString *n, expdesc *var) { + FuncState *fs; + int level = 0; + for (fs=ls->fs; fs; fs=fs->prev) { + int i; + for (i=fs->nactloc-1; i >= 0; i--) { + if (n == fs->f->locvars[fs->actloc[i]].varname) { + var->k = VLOCAL; + var->u.index = i; + return level; + } + } + level++; /* `var' not found; check outer level */ + } + var->k = VGLOBAL; /* not found in any level; must be global */ + return -1; +} + + +static void singlevar (LexState *ls, TString *n, expdesc *var) { + int level = search_local(ls, n, var); + if (level >= 1) /* neither local (0) nor global (-1)? */ + luaX_syntaxerror(ls, "cannot access a variable in outer scope", n->str); + else if (level == -1) /* global? */ + var->u.index = string_constant(ls->fs, n); +} + + +static int indexupvalue (LexState *ls, expdesc *v) { + FuncState *fs = ls->fs; + int i; + for (i=0; inupvalues; i++) { + if (fs->upvalues[i].k == v->k && fs->upvalues[i].u.index == v->u.index) + return i; + } + /* new one */ + luaX_checklimit(ls, fs->nupvalues+1, MAXUPVALUES, "upvalues"); + fs->upvalues[fs->nupvalues] = *v; + return fs->nupvalues++; +} + + +static void pushupvalue (LexState *ls, TString *n) { + FuncState *fs = ls->fs; + expdesc v; + int level = search_local(ls, n, &v); + if (level == -1) { /* global? */ + if (fs->prev == NULL) + luaX_syntaxerror(ls, "cannot access upvalue in main", n->str); + v.u.index = string_constant(fs->prev, n); + } + else if (level != 1) + luaX_syntaxerror(ls, + "upvalue must be global or local to immediately outer scope", n->str); + luaK_code1(fs, OP_PUSHUPVALUE, indexupvalue(ls, &v)); +} + + +static void adjust_mult_assign (LexState *ls, int nvars, int nexps) { + FuncState *fs = ls->fs; + int diff = nexps - nvars; + if (nexps > 0 && luaK_lastisopen(fs)) { /* list ends in a function call */ + diff--; /* do not count function call itself */ + if (diff <= 0) { /* more variables than values? */ + luaK_setcallreturns(fs, -diff); /* function call provide extra values */ + diff = 0; /* no more difference */ + } + else /* more values than variables */ + luaK_setcallreturns(fs, 0); /* call should provide no value */ + } + /* push or pop eventual difference between list lengths */ + luaK_adjuststack(fs, diff); +} + + +static void code_params (LexState *ls, int nparams, int dots) { + FuncState *fs = ls->fs; + adjustlocalvars(ls, nparams); + luaX_checklimit(ls, fs->nactloc, MAXPARAMS, "parameters"); + fs->f->numparams = fs->nactloc; /* `self' could be there already */ + fs->f->is_vararg = dots; + if (dots) { + new_localvarstr(ls, "arg", 0); + adjustlocalvars(ls, 1); + } + luaK_deltastack(fs, fs->nactloc); /* count parameters in the stack */ +} + + +static void enterbreak (FuncState *fs, Breaklabel *bl) { + bl->stacklevel = fs->stacklevel; + bl->breaklist = NO_JUMP; + bl->previous = fs->bl; + fs->bl = bl; +} + + +static void leavebreak (FuncState *fs, Breaklabel *bl) { + fs->bl = bl->previous; + LUA_ASSERT(bl->stacklevel == fs->stacklevel, "wrong levels"); + luaK_patchlist(fs, bl->breaklist, luaK_getlabel(fs)); +} + + +static void pushclosure (LexState *ls, FuncState *func) { + FuncState *fs = ls->fs; + Proto *f = fs->f; + int i; + for (i=0; inupvalues; i++) + luaK_tostack(ls, &func->upvalues[i], 1); + luaM_growvector(ls->L, f->kproto, f->nkproto, 1, Proto *, + "constant table overflow", MAXARG_A); + f->kproto[f->nkproto++] = func->f; + luaK_code2(fs, OP_CLOSURE, f->nkproto-1, func->nupvalues); +} + + +static void open_func (LexState *ls, FuncState *fs) { + Proto *f = luaF_newproto(ls->L); + fs->prev = ls->fs; /* linked list of funcstates */ + fs->ls = ls; + fs->L = ls->L; + ls->fs = fs; + fs->stacklevel = 0; + fs->nactloc = 0; + fs->nupvalues = 0; + fs->bl = NULL; + fs->f = f; + f->source = ls->source; + fs->pc = 0; + fs->lasttarget = 0; + fs->lastline = 0; + fs->jlt = NO_JUMP; + f->code = NULL; + f->maxstacksize = 0; + f->numparams = 0; /* default for main chunk */ + f->is_vararg = 0; /* default for main chunk */ +} + + +static void close_func (LexState *ls) { + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; + luaK_code0(fs, OP_END); + luaK_getlabel(fs); /* close eventual list of pending jumps */ + luaM_reallocvector(L, f->code, fs->pc, Instruction); + luaM_reallocvector(L, f->kstr, f->nkstr, TString *); + luaM_reallocvector(L, f->knum, f->nknum, Number); + luaM_reallocvector(L, f->kproto, f->nkproto, Proto *); + removelocalvars(ls, fs->nactloc); + luaM_reallocvector(L, f->locvars, f->nlocvars, LocVar); + luaM_reallocvector(L, f->lineinfo, f->nlineinfo+1, int); + f->lineinfo[f->nlineinfo++] = MAX_INT; /* end flag */ + luaF_protook(L, f, fs->pc); /* proto is ok now */ + ls->fs = fs->prev; + LUA_ASSERT(fs->bl == NULL, "wrong list end"); +} + + +Proto *luaY_parser (lua_State *L, ZIO *z) { + struct LexState lexstate; + struct FuncState funcstate; + luaX_setinput(L, &lexstate, z, luaS_new(L, zname(z))); + open_func(&lexstate, &funcstate); + next(&lexstate); /* read first token */ + chunk(&lexstate); + check_condition(&lexstate, (lexstate.t.token == TK_EOS), " expected"); + close_func(&lexstate); + LUA_ASSERT(funcstate.prev == NULL, "wrong list end"); + LUA_ASSERT(funcstate.nupvalues == 0, "no upvalues in main"); + return funcstate.f; +} + + + +/*============================================================*/ +/* GRAMMAR RULES */ +/*============================================================*/ + + +static int explist1 (LexState *ls) { + /* explist1 -> expr { ',' expr } */ + int n = 1; /* at least one expression */ + expdesc v; + expr(ls, &v); + while (ls->t.token == ',') { + luaK_tostack(ls, &v, 1); /* gets only 1 value from previous expression */ + next(ls); /* skip comma */ + expr(ls, &v); + n++; + } + luaK_tostack(ls, &v, 0); /* keep open number of values of last expression */ + return n; +} + + +static void funcargs (LexState *ls, int slf) { + FuncState *fs = ls->fs; + int slevel = fs->stacklevel - slf - 1; /* where is func in the stack */ + switch (ls->t.token) { + case '(': { /* funcargs -> '(' [ explist1 ] ')' */ + int line = ls->linenumber; + int nargs = 0; + next(ls); + if (ls->t.token != ')') /* arg list not empty? */ + nargs = explist1(ls); + check_match(ls, ')', '(', line); +#ifdef LUA_COMPAT_ARGRET + if (nargs > 0) /* arg list is not empty? */ + luaK_setcallreturns(fs, 1); /* last call returns only 1 value */ +#else + UNUSED(nargs); /* to avoid warnings */ +#endif + break; + } + case '{': { /* funcargs -> constructor */ + constructor(ls); + break; + } + case TK_STRING: { /* funcargs -> STRING */ + code_string(ls, ls->t.seminfo.ts); /* must use `seminfo' before `next' */ + next(ls); + break; + } + default: { + luaK_error(ls, "function arguments expected"); + break; + } + } + fs->stacklevel = slevel; /* call will remove function and arguments */ + luaK_code2(fs, OP_CALL, slevel, MULT_RET); +} + + +static void var_or_func_tail (LexState *ls, expdesc *v) { + for (;;) { + switch (ls->t.token) { + case '.': { /* var_or_func_tail -> '.' NAME */ + next(ls); + luaK_tostack(ls, v, 1); /* `v' must be on stack */ + luaK_kstr(ls, checkname(ls)); + v->k = VINDEXED; + break; + } + case '[': { /* var_or_func_tail -> '[' exp1 ']' */ + next(ls); + luaK_tostack(ls, v, 1); /* `v' must be on stack */ + v->k = VINDEXED; + exp1(ls); + check(ls, ']'); + break; + } + case ':': { /* var_or_func_tail -> ':' NAME funcargs */ + int name; + next(ls); + name = checkname(ls); + luaK_tostack(ls, v, 1); /* `v' must be on stack */ + luaK_code1(ls->fs, OP_PUSHSELF, name); + funcargs(ls, 1); + v->k = VEXP; + v->u.l.t = v->u.l.f = NO_JUMP; + break; + } + case '(': case TK_STRING: case '{': { /* var_or_func_tail -> funcargs */ + luaK_tostack(ls, v, 1); /* `v' must be on stack */ + funcargs(ls, 0); + v->k = VEXP; + v->u.l.t = v->u.l.f = NO_JUMP; + break; + } + default: return; /* should be follow... */ + } + } +} + + +static void var_or_func (LexState *ls, expdesc *v) { + /* var_or_func -> ['%'] NAME var_or_func_tail */ + if (optional(ls, '%')) { /* upvalue? */ + pushupvalue(ls, str_checkname(ls)); + v->k = VEXP; + v->u.l.t = v->u.l.f = NO_JUMP; + } + else /* variable name */ + singlevar(ls, str_checkname(ls), v); + var_or_func_tail(ls, v); +} + + + +/* +** {====================================================================== +** Rules for Constructors +** ======================================================================= +*/ + + +static void recfield (LexState *ls) { + /* recfield -> (NAME | '['exp1']') = exp1 */ + switch (ls->t.token) { + case TK_NAME: { + luaK_kstr(ls, checkname(ls)); + break; + } + case '[': { + next(ls); + exp1(ls); + check(ls, ']'); + break; + } + default: luaK_error(ls, " or `[' expected"); + } + check(ls, '='); + exp1(ls); +} + + +static int recfields (LexState *ls) { + /* recfields -> recfield { ',' recfield } [','] */ + FuncState *fs = ls->fs; + int n = 1; /* at least one element */ + recfield(ls); + while (ls->t.token == ',') { + next(ls); + if (ls->t.token == ';' || ls->t.token == '}') + break; + recfield(ls); + n++; + if (n%RFIELDS_PER_FLUSH == 0) + luaK_code1(fs, OP_SETMAP, RFIELDS_PER_FLUSH); + } + luaK_code1(fs, OP_SETMAP, n%RFIELDS_PER_FLUSH); + return n; +} + + +static int listfields (LexState *ls) { + /* listfields -> exp1 { ',' exp1 } [','] */ + FuncState *fs = ls->fs; + int n = 1; /* at least one element */ + exp1(ls); + while (ls->t.token == ',') { + next(ls); + if (ls->t.token == ';' || ls->t.token == '}') + break; + exp1(ls); + n++; + luaX_checklimit(ls, n/LFIELDS_PER_FLUSH, MAXARG_A, + "`item groups' in a list initializer"); + if (n%LFIELDS_PER_FLUSH == 0) + luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH - 1, LFIELDS_PER_FLUSH); + } + luaK_code2(fs, OP_SETLIST, n/LFIELDS_PER_FLUSH, n%LFIELDS_PER_FLUSH); + return n; +} + + + +static void constructor_part (LexState *ls, Constdesc *cd) { + switch (ls->t.token) { + case ';': case '}': { /* constructor_part -> empty */ + cd->n = 0; + cd->k = ls->t.token; + break; + } + case TK_NAME: { /* may be listfields or recfields */ + lookahead(ls); + if (ls->lookahead.token != '=') /* expression? */ + goto case_default; + /* else go through to recfields */ + } + case '[': { /* constructor_part -> recfields */ + cd->n = recfields(ls); + cd->k = 1; /* record */ + break; + } + default: { /* constructor_part -> listfields */ + case_default: + cd->n = listfields(ls); + cd->k = 0; /* list */ + break; + } + } +} + + +static void constructor (LexState *ls) { + /* constructor -> '{' constructor_part [';' constructor_part] '}' */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + int pc = luaK_code1(fs, OP_CREATETABLE, 0); + int nelems; + Constdesc cd; + check(ls, '{'); + constructor_part(ls, &cd); + nelems = cd.n; + if (optional(ls, ';')) { + Constdesc other_cd; + constructor_part(ls, &other_cd); + check_condition(ls, (cd.k != other_cd.k), "invalid constructor syntax"); + nelems += other_cd.n; + } + check_match(ls, '}', '{', line); + luaX_checklimit(ls, nelems, MAXARG_U, "elements in a table constructor"); + SETARG_U(fs->f->code[pc], nelems); /* set initial table size */ +} + +/* }====================================================================== */ + + + + +/* +** {====================================================================== +** Expression parsing +** ======================================================================= +*/ + + +static void simpleexp (LexState *ls, expdesc *v) { + FuncState *fs = ls->fs; + switch (ls->t.token) { + case TK_NUMBER: { /* simpleexp -> NUMBER */ + Number r = ls->t.seminfo.r; + next(ls); + luaK_number(fs, r); + break; + } + case TK_STRING: { /* simpleexp -> STRING */ + code_string(ls, ls->t.seminfo.ts); /* must use `seminfo' before `next' */ + next(ls); + break; + } + case TK_NIL: { /* simpleexp -> NIL */ + luaK_adjuststack(fs, -1); + next(ls); + break; + } + case '{': { /* simpleexp -> constructor */ + constructor(ls); + break; + } + case TK_FUNCTION: { /* simpleexp -> FUNCTION body */ + next(ls); + body(ls, 0, ls->linenumber); + break; + } + case '(': { /* simpleexp -> '(' expr ')' */ + next(ls); + expr(ls, v); + check(ls, ')'); + return; + } + case TK_NAME: case '%': { + var_or_func(ls, v); + return; + } + default: { + luaK_error(ls, " expected"); + return; + } + } + v->k = VEXP; + v->u.l.t = v->u.l.f = NO_JUMP; +} + + +static void exp1 (LexState *ls) { + expdesc v; + expr(ls, &v); + luaK_tostack(ls, &v, 1); +} + + +static UnOpr getunopr (int op) { + switch (op) { + case TK_NOT: return OPR_NOT; + case '-': return OPR_MINUS; + default: return OPR_NOUNOPR; + } +} + + +static BinOpr getbinopr (int op) { + switch (op) { + case '+': return OPR_ADD; + case '-': return OPR_SUB; + case '*': return OPR_MULT; + case '/': return OPR_DIV; + case '^': return OPR_POW; + case TK_CONCAT: return OPR_CONCAT; + case TK_NE: return OPR_NE; + case TK_EQ: return OPR_EQ; + case '<': return OPR_LT; + case TK_LE: return OPR_LE; + case '>': return OPR_GT; + case TK_GE: return OPR_GE; + case TK_AND: return OPR_AND; + case TK_OR: return OPR_OR; + default: return OPR_NOBINOPR; + } +} + + +static const struct { + char left; /* left priority for each binary operator */ + char right; /* right priority */ +} priority[] = { /* ORDER OPR */ + {5, 5}, {5, 5}, {6, 6}, {6, 6}, /* arithmetic */ + {9, 8}, {4, 3}, /* power and concat (right associative) */ + {2, 2}, {2, 2}, /* equality */ + {2, 2}, {2, 2}, {2, 2}, {2, 2}, /* order */ + {1, 1}, {1, 1} /* logical */ +}; + +#define UNARY_PRIORITY 7 /* priority for unary operators */ + + +/* +** subexpr -> (simplexep | unop subexpr) { binop subexpr } +** where `binop' is any binary operator with a priority higher than `limit' +*/ +static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { + BinOpr op; + UnOpr uop = getunopr(ls->t.token); + if (uop != OPR_NOUNOPR) { + next(ls); + subexpr(ls, v, UNARY_PRIORITY); + luaK_prefix(ls, uop, v); + } + else simpleexp(ls, v); + /* expand while operators have priorities higher than `limit' */ + op = getbinopr(ls->t.token); + while (op != OPR_NOBINOPR && priority[op].left > limit) { + expdesc v2; + BinOpr nextop; + next(ls); + luaK_infix(ls, op, v); + /* read sub-expression with higher priority */ + nextop = subexpr(ls, &v2, priority[op].right); + luaK_posfix(ls, op, v, &v2); + op = nextop; + } + return op; /* return first untreated operator */ +} + + +static void expr (LexState *ls, expdesc *v) { + subexpr(ls, v, -1); +} + +/* }==================================================================== */ + + +/* +** {====================================================================== +** Rules for Statements +** ======================================================================= +*/ + + +static int block_follow (int token) { + switch (token) { + case TK_ELSE: case TK_ELSEIF: case TK_END: + case TK_UNTIL: case TK_EOS: + return 1; + default: return 0; + } +} + + +static void block (LexState *ls) { + /* block -> chunk */ + FuncState *fs = ls->fs; + int nactloc = fs->nactloc; + chunk(ls); + luaK_adjuststack(fs, fs->nactloc - nactloc); /* remove local variables */ + removelocalvars(ls, fs->nactloc - nactloc); +} + + +static int assignment (LexState *ls, expdesc *v, int nvars) { + int left = 0; /* number of values left in the stack after assignment */ + luaX_checklimit(ls, nvars, MAXVARSLH, "variables in a multiple assignment"); + if (ls->t.token == ',') { /* assignment -> ',' NAME assignment */ + expdesc nv; + next(ls); + var_or_func(ls, &nv); + check_condition(ls, (nv.k != VEXP), "syntax error"); + left = assignment(ls, &nv, nvars+1); + } + else { /* assignment -> '=' explist1 */ + int nexps; + check(ls, '='); + nexps = explist1(ls); + adjust_mult_assign(ls, nvars, nexps); + } + if (v->k != VINDEXED) + luaK_storevar(ls, v); + else { /* there may be garbage between table-index and value */ + luaK_code2(ls->fs, OP_SETTABLE, left+nvars+2, 1); + left += 2; + } + return left; +} + + +static void cond (LexState *ls, expdesc *v) { + /* cond -> exp */ + expr(ls, v); /* read condition */ + luaK_goiftrue(ls->fs, v, 0); +} + + +static void whilestat (LexState *ls, int line) { + /* whilestat -> WHILE cond DO block END */ + FuncState *fs = ls->fs; + int while_init = luaK_getlabel(fs); + expdesc v; + Breaklabel bl; + enterbreak(fs, &bl); + next(ls); + cond(ls, &v); + check(ls, TK_DO); + block(ls); + luaK_patchlist(fs, luaK_jump(fs), while_init); + luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); + check_match(ls, TK_END, TK_WHILE, line); + leavebreak(fs, &bl); +} + + +static void repeatstat (LexState *ls, int line) { + /* repeatstat -> REPEAT block UNTIL cond */ + FuncState *fs = ls->fs; + int repeat_init = luaK_getlabel(fs); + expdesc v; + Breaklabel bl; + enterbreak(fs, &bl); + next(ls); + block(ls); + check_match(ls, TK_UNTIL, TK_REPEAT, line); + cond(ls, &v); + luaK_patchlist(fs, v.u.l.f, repeat_init); + leavebreak(fs, &bl); +} + + +static void forbody (LexState *ls, int nvar, OpCode prepfor, OpCode loopfor) { + /* forbody -> DO block END */ + FuncState *fs = ls->fs; + int prep = luaK_code1(fs, prepfor, NO_JUMP); + int blockinit = luaK_getlabel(fs); + check(ls, TK_DO); + adjustlocalvars(ls, nvar); /* scope for control variables */ + block(ls); + luaK_patchlist(fs, luaK_code1(fs, loopfor, NO_JUMP), blockinit); + luaK_patchlist(fs, prep, luaK_getlabel(fs)); + removelocalvars(ls, nvar); +} + + +static void fornum (LexState *ls, TString *varname) { + /* fornum -> NAME = exp1,exp1[,exp1] forbody */ + FuncState *fs = ls->fs; + check(ls, '='); + exp1(ls); /* initial value */ + check(ls, ','); + exp1(ls); /* limit */ + if (optional(ls, ',')) + exp1(ls); /* optional step */ + else + luaK_code1(fs, OP_PUSHINT, 1); /* default step */ + new_localvar(ls, varname, 0); + new_localvarstr(ls, "(limit)", 1); + new_localvarstr(ls, "(step)", 2); + forbody(ls, 3, OP_FORPREP, OP_FORLOOP); +} + + +static void forlist (LexState *ls, TString *indexname) { + /* forlist -> NAME,NAME IN exp1 forbody */ + TString *valname; + check(ls, ','); + valname = str_checkname(ls); + /* next test is dirty, but avoids `in' being a reserved word */ + check_condition(ls, + (ls->t.token == TK_NAME && ls->t.seminfo.ts == luaS_new(ls->L, "in")), + "`in' expected"); + next(ls); /* skip `in' */ + exp1(ls); /* table */ + new_localvarstr(ls, "(table)", 0); + new_localvar(ls, indexname, 1); + new_localvar(ls, valname, 2); + forbody(ls, 3, OP_LFORPREP, OP_LFORLOOP); +} + + +static void forstat (LexState *ls, int line) { + /* forstat -> fornum | forlist */ + FuncState *fs = ls->fs; + TString *varname; + Breaklabel bl; + enterbreak(fs, &bl); + next(ls); /* skip `for' */ + varname = str_checkname(ls); /* first variable name */ + switch (ls->t.token) { + case '=': fornum(ls, varname); break; + case ',': forlist(ls, varname); break; + default: luaK_error(ls, "`=' or `,' expected"); + } + check_match(ls, TK_END, TK_FOR, line); + leavebreak(fs, &bl); +} + + +static void test_then_block (LexState *ls, expdesc *v) { + /* test_then_block -> [IF | ELSEIF] cond THEN block */ + next(ls); /* skip IF or ELSEIF */ + cond(ls, v); + check(ls, TK_THEN); + block(ls); /* `then' part */ +} + + +static void ifstat (LexState *ls, int line) { + /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ + FuncState *fs = ls->fs; + expdesc v; + int escapelist = NO_JUMP; + test_then_block(ls, &v); /* IF cond THEN block */ + while (ls->t.token == TK_ELSEIF) { + luaK_concat(fs, &escapelist, luaK_jump(fs)); + luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); + test_then_block(ls, &v); /* ELSEIF cond THEN block */ + } + if (ls->t.token == TK_ELSE) { + luaK_concat(fs, &escapelist, luaK_jump(fs)); + luaK_patchlist(fs, v.u.l.f, luaK_getlabel(fs)); + next(ls); /* skip ELSE */ + block(ls); /* `else' part */ + } + else + luaK_concat(fs, &escapelist, v.u.l.f); + luaK_patchlist(fs, escapelist, luaK_getlabel(fs)); + check_match(ls, TK_END, TK_IF, line); +} + + +static void localstat (LexState *ls) { + /* stat -> LOCAL NAME {',' NAME} ['=' explist1] */ + int nvars = 0; + int nexps; + do { + next(ls); /* skip LOCAL or ',' */ + new_localvar(ls, str_checkname(ls), nvars++); + } while (ls->t.token == ','); + if (optional(ls, '=')) + nexps = explist1(ls); + else + nexps = 0; + adjust_mult_assign(ls, nvars, nexps); + adjustlocalvars(ls, nvars); +} + + +static int funcname (LexState *ls, expdesc *v) { + /* funcname -> NAME [':' NAME | '.' NAME] */ + int needself = 0; + singlevar(ls, str_checkname(ls), v); + if (ls->t.token == ':' || ls->t.token == '.') { + needself = (ls->t.token == ':'); + next(ls); + luaK_tostack(ls, v, 1); + luaK_kstr(ls, checkname(ls)); + v->k = VINDEXED; + } + return needself; +} + + +static void funcstat (LexState *ls, int line) { + /* funcstat -> FUNCTION funcname body */ + int needself; + expdesc v; + next(ls); /* skip FUNCTION */ + needself = funcname(ls, &v); + body(ls, needself, line); + luaK_storevar(ls, &v); +} + + +static void namestat (LexState *ls) { + /* stat -> func | ['%'] NAME assignment */ + FuncState *fs = ls->fs; + expdesc v; + var_or_func(ls, &v); + if (v.k == VEXP) { /* stat -> func */ + check_condition(ls, luaK_lastisopen(fs), "syntax error"); /* an upvalue? */ + luaK_setcallreturns(fs, 0); /* call statement uses no results */ + } + else { /* stat -> ['%'] NAME assignment */ + int left = assignment(ls, &v, 1); + luaK_adjuststack(fs, left); /* remove eventual garbage left on stack */ + } +} + + +static void retstat (LexState *ls) { + /* stat -> RETURN explist */ + FuncState *fs = ls->fs; + next(ls); /* skip RETURN */ + if (!block_follow(ls->t.token) && ls->t.token != ';') + explist1(ls); /* optional return values */ + luaK_code1(fs, OP_RETURN, ls->fs->nactloc); + fs->stacklevel = fs->nactloc; /* removes all temp values */ +} + + +static void breakstat (LexState *ls) { + /* stat -> BREAK [NAME] */ + FuncState *fs = ls->fs; + int currentlevel = fs->stacklevel; + Breaklabel *bl = fs->bl; + if (!bl) + luaK_error(ls, "no loop to break"); + next(ls); /* skip BREAK */ + luaK_adjuststack(fs, currentlevel - bl->stacklevel); + luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); + /* correct stack for compiler and symbolic execution */ + luaK_adjuststack(fs, bl->stacklevel - currentlevel); +} + + +static int stat (LexState *ls) { + int line = ls->linenumber; /* may be needed for error messages */ + switch (ls->t.token) { + case TK_IF: { /* stat -> ifstat */ + ifstat(ls, line); + return 0; + } + case TK_WHILE: { /* stat -> whilestat */ + whilestat(ls, line); + return 0; + } + case TK_DO: { /* stat -> DO block END */ + next(ls); /* skip DO */ + block(ls); + check_match(ls, TK_END, TK_DO, line); + return 0; + } + case TK_FOR: { /* stat -> forstat */ + forstat(ls, line); + return 0; + } + case TK_REPEAT: { /* stat -> repeatstat */ + repeatstat(ls, line); + return 0; + } + case TK_FUNCTION: { /* stat -> funcstat */ + funcstat(ls, line); + return 0; + } + case TK_LOCAL: { /* stat -> localstat */ + localstat(ls); + return 0; + } + case TK_NAME: case '%': { /* stat -> namestat */ + namestat(ls); + return 0; + } + case TK_RETURN: { /* stat -> retstat */ + retstat(ls); + return 1; /* must be last statement */ + } + case TK_BREAK: { /* stat -> breakstat */ + breakstat(ls); + return 1; /* must be last statement */ + } + default: { + luaK_error(ls, " expected"); + return 0; /* to avoid warnings */ + } + } +} + + +static void parlist (LexState *ls) { + /* parlist -> [ param { ',' param } ] */ + int nparams = 0; + int dots = 0; + if (ls->t.token != ')') { /* is `parlist' not empty? */ + do { + switch (ls->t.token) { + case TK_DOTS: next(ls); dots = 1; break; + case TK_NAME: new_localvar(ls, str_checkname(ls), nparams++); break; + default: luaK_error(ls, " or `...' expected"); + } + } while (!dots && optional(ls, ',')); + } + code_params(ls, nparams, dots); +} + + +static void body (LexState *ls, int needself, int line) { + /* body -> '(' parlist ')' chunk END */ + FuncState new_fs; + open_func(ls, &new_fs); + new_fs.f->lineDefined = line; + check(ls, '('); + if (needself) { + new_localvarstr(ls, "self", 0); + adjustlocalvars(ls, 1); + } + parlist(ls); + check(ls, ')'); + chunk(ls); + check_match(ls, TK_END, TK_FUNCTION, line); + close_func(ls); + pushclosure(ls, &new_fs); +} + + +/* }====================================================================== */ + + +static void chunk (LexState *ls) { + /* chunk -> { stat [';'] } */ + int islast = 0; + while (!islast && !block_follow(ls->t.token)) { + islast = stat(ls); + optional(ls, ';'); + LUA_ASSERT(ls->fs->stacklevel == ls->fs->nactloc, + "stack size != # local vars"); + } +} + diff --git a/build/premake/src/Src/Lua/lparser.h b/build/premake/src/Src/Lua/lparser.h new file mode 100644 index 0000000000..eb3b057ed8 --- /dev/null +++ b/build/premake/src/Src/Lua/lparser.h @@ -0,0 +1,60 @@ +/* +** $Id: lparser.h,v 1.1 2003/01/24 16:26:12 jason379 Exp $ +** LL(1) Parser and code generator for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lparser_h +#define lparser_h + +#include "lobject.h" +#include "lzio.h" + + +/* +** Expression descriptor +*/ + +typedef enum { + VGLOBAL, + VLOCAL, + VINDEXED, + VEXP +} expkind; + +typedef struct expdesc { + expkind k; + union { + int index; /* VGLOBAL: `kstr' index of global name; VLOCAL: stack index */ + struct { + int t; /* patch list of `exit when true' */ + int f; /* patch list of `exit when false' */ + } l; + } u; +} expdesc; + + + +/* state needed to generate code for a given function */ +typedef struct FuncState { + Proto *f; /* current function header */ + struct FuncState *prev; /* enclosing function */ + struct LexState *ls; /* lexical state */ + struct lua_State *L; /* copy of the Lua state */ + int pc; /* next position to code */ + int lasttarget; /* `pc' of last `jump target' */ + int jlt; /* list of jumps to `lasttarget' */ + short stacklevel; /* number of values on activation register */ + short nactloc; /* number of active local variables */ + short nupvalues; /* number of upvalues */ + int lastline; /* line where last `lineinfo' was generated */ + struct Breaklabel *bl; /* chain of breakable blocks */ + expdesc upvalues[MAXUPVALUES]; /* upvalues */ + int actloc[MAXLOCALS]; /* local-variable stack (indices to locvars) */ +} FuncState; + + +Proto *luaY_parser (lua_State *L, ZIO *z); + + +#endif diff --git a/build/premake/src/Src/Lua/lstate.c b/build/premake/src/Src/Lua/lstate.c new file mode 100644 index 0000000000..64197c7af5 --- /dev/null +++ b/build/premake/src/Src/Lua/lstate.c @@ -0,0 +1,121 @@ +/* +** $Id: lstate.c,v 1.1 2003/01/24 16:26:12 jason379 Exp $ +** Global State +** See Copyright Notice in lua.h +*/ + + +#include + +#include "lua.h" + +#include "ldo.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +#ifdef LUA_DEBUG +static lua_State *lua_state = NULL; +void luaB_opentests (lua_State *L); +#endif + + +/* +** built-in implementation for ERRORMESSAGE. In a "correct" environment +** ERRORMESSAGE should have an external definition, and so this function +** would not be used. +*/ +static int errormessage (lua_State *L) { + const char *s = lua_tostring(L, 1); + if (s == NULL) s = "(no message)"; + fprintf(stderr, "error: %s\n", s); + return 0; +} + + +/* +** open parts that may cause memory-allocation errors +*/ +static void f_luaopen (lua_State *L, void *ud) { + int stacksize = *(int *)ud; + if (stacksize == 0) + stacksize = DEFAULT_STACK_SIZE; + else + stacksize += LUA_MINSTACK; + L->gt = luaH_new(L, 10); /* table of globals */ + luaD_init(L, stacksize); + luaS_init(L); + luaX_init(L); + luaT_init(L); + lua_newtable(L); + lua_ref(L, 1); /* create registry */ + lua_register(L, LUA_ERRORMESSAGE, errormessage); +#ifdef LUA_DEBUG + luaB_opentests(L); + if (lua_state == NULL) lua_state = L; /* keep first state to be opened */ +#endif + LUA_ASSERT(lua_gettop(L) == 0, "wrong API stack"); +} + + +LUA_API lua_State *lua_open (int stacksize) { + lua_State *L = luaM_new(NULL, lua_State); + if (L == NULL) return NULL; /* memory allocation error */ + L->stack = NULL; + L->strt.size = L->udt.size = 0; + L->strt.nuse = L->udt.nuse = 0; + L->strt.hash = NULL; + L->udt.hash = NULL; + L->Mbuffer = NULL; + L->Mbuffsize = 0; + L->rootproto = NULL; + L->rootcl = NULL; + L->roottable = NULL; + L->TMtable = NULL; + L->last_tag = -1; + L->refArray = NULL; + L->refSize = 0; + L->refFree = NONEXT; + L->nblocks = sizeof(lua_State); + L->GCthreshold = MAX_INT; /* to avoid GC during pre-definitions */ + L->callhook = NULL; + L->linehook = NULL; + L->allowhooks = 1; + L->errorJmp = NULL; + if (luaD_runprotected(L, f_luaopen, &stacksize) != 0) { + /* memory allocation error: free partial state */ + lua_close(L); + return NULL; + } + L->GCthreshold = 2*L->nblocks; + return L; +} + + +LUA_API void lua_close (lua_State *L) { + LUA_ASSERT(L != lua_state || lua_gettop(L) == 0, "garbage in C stack"); + luaC_collect(L, 1); /* collect all elements */ + LUA_ASSERT(L->rootproto == NULL, "list should be empty"); + LUA_ASSERT(L->rootcl == NULL, "list should be empty"); + LUA_ASSERT(L->roottable == NULL, "list should be empty"); + luaS_freeall(L); + if (L->stack) + L->nblocks -= (L->stack_last - L->stack + 1)*sizeof(TObject); + luaM_free(L, L->stack); + L->nblocks -= (L->last_tag+1)*sizeof(struct TM); + luaM_free(L, L->TMtable); + L->nblocks -= (L->refSize)*sizeof(struct Ref); + luaM_free(L, L->refArray); + L->nblocks -= (L->Mbuffsize)*sizeof(char); + luaM_free(L, L->Mbuffer); + LUA_ASSERT(L->nblocks == sizeof(lua_State), "wrong count for nblocks"); + luaM_free(L, L); + LUA_ASSERT(L != lua_state || memdebug_numblocks == 0, "memory leak!"); + LUA_ASSERT(L != lua_state || memdebug_total == 0,"memory leak!"); +} + diff --git a/build/premake/src/Src/Lua/lstate.h b/build/premake/src/Src/Lua/lstate.h new file mode 100644 index 0000000000..2470a0cd3d --- /dev/null +++ b/build/premake/src/Src/Lua/lstate.h @@ -0,0 +1,77 @@ +/* +** $Id: lstate.h,v 1.1 2003/01/24 16:26:12 jason379 Exp $ +** Global State +** See Copyright Notice in lua.h +*/ + +#ifndef lstate_h +#define lstate_h + +#include "lobject.h" +#include "lua.h" +#include "luadebug.h" + + + +typedef TObject *StkId; /* index to stack elements */ + + +/* +** marks for Reference array +*/ +#define NONEXT -1 /* to end the free list */ +#define HOLD -2 +#define COLLECTED -3 +#define LOCK -4 + + +struct Ref { + TObject o; + int st; /* can be LOCK, HOLD, COLLECTED, or next (for free list) */ +}; + + +struct lua_longjmp; /* defined in ldo.c */ +struct TM; /* defined in ltm.h */ + + +typedef struct stringtable { + int size; + lint32 nuse; /* number of elements */ + TString **hash; +} stringtable; + + + +struct lua_State { + /* thread-specific state */ + StkId top; /* first free slot in the stack */ + StkId stack; /* stack base */ + StkId stack_last; /* last free slot in the stack */ + int stacksize; + StkId Cbase; /* base for current C function */ + struct lua_longjmp *errorJmp; /* current error recover point */ + char *Mbuffer; /* global buffer */ + size_t Mbuffsize; /* size of Mbuffer */ + /* global state */ + Proto *rootproto; /* list of all prototypes */ + Closure *rootcl; /* list of all closures */ + Hash *roottable; /* list of all tables */ + stringtable strt; /* hash table for strings */ + stringtable udt; /* hash table for udata */ + Hash *gt; /* table for globals */ + struct TM *TMtable; /* table for tag methods */ + int last_tag; /* last used tag in TMtable */ + struct Ref *refArray; /* locked objects */ + int refSize; /* size of refArray */ + int refFree; /* list of free positions in refArray */ + unsigned long GCthreshold; + unsigned long nblocks; /* number of `bytes' currently allocated */ + lua_Hook callhook; + lua_Hook linehook; + int allowhooks; +}; + + +#endif + diff --git a/build/premake/src/Src/Lua/lstring.c b/build/premake/src/Src/Lua/lstring.c new file mode 100644 index 0000000000..62fc183d83 --- /dev/null +++ b/build/premake/src/Src/Lua/lstring.c @@ -0,0 +1,155 @@ +/* +** $Id: lstring.c,v 1.1 2003/01/24 16:26:12 jason379 Exp $ +** String table (keeps all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + + +#include + +#include "lua.h" + +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" + + +/* +** type equivalent to TString, but with maximum alignment requirements +*/ +union L_UTString { + TString ts; + union L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ +}; + + + +void luaS_init (lua_State *L) { + L->strt.hash = luaM_newvector(L, 1, TString *); + L->udt.hash = luaM_newvector(L, 1, TString *); + L->nblocks += 2*sizeof(TString *); + L->strt.size = L->udt.size = 1; + L->strt.nuse = L->udt.nuse = 0; + L->strt.hash[0] = L->udt.hash[0] = NULL; +} + + +void luaS_freeall (lua_State *L) { + LUA_ASSERT(L->strt.nuse==0, "non-empty string table"); + L->nblocks -= (L->strt.size + L->udt.size)*sizeof(TString *); + luaM_free(L, L->strt.hash); + LUA_ASSERT(L->udt.nuse==0, "non-empty udata table"); + luaM_free(L, L->udt.hash); +} + + +static unsigned long hash_s (const char *s, size_t l) { + unsigned long h = l; /* seed */ + size_t step = (l>>5)|1; /* if string is too long, don't hash all its chars */ + for (; l>=step; l-=step) + h = h ^ ((h<<5)+(h>>2)+(unsigned char)*(s++)); + return h; +} + + +void luaS_resize (lua_State *L, stringtable *tb, int newsize) { + TString **newhash = luaM_newvector(L, newsize, TString *); + int i; + for (i=0; isize; i++) { + TString *p = tb->hash[i]; + while (p) { /* for each node in the list */ + TString *next = p->nexthash; /* save next */ + unsigned long h = (tb == &L->strt) ? p->u.s.hash : IntPoint(p->u.d.value); + int h1 = h&(newsize-1); /* new position */ + LUA_ASSERT(h%newsize == (h&(newsize-1)), + "a&(x-1) == a%x, for x power of 2"); + p->nexthash = newhash[h1]; /* chain it in new position */ + newhash[h1] = p; + p = next; + } + } + luaM_free(L, tb->hash); + L->nblocks += (newsize - tb->size)*sizeof(TString *); + tb->size = newsize; + tb->hash = newhash; +} + + +static void newentry (lua_State *L, stringtable *tb, TString *ts, int h) { + ts->nexthash = tb->hash[h]; /* chain new entry */ + tb->hash[h] = ts; + tb->nuse++; + if (tb->nuse > (lint32)tb->size && tb->size < MAX_INT/2) /* too crowded? */ + luaS_resize(L, tb, tb->size*2); +} + + + +TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { + unsigned long h = hash_s(str, l); + int h1 = h & (L->strt.size-1); + TString *ts; + for (ts = L->strt.hash[h1]; ts; ts = ts->nexthash) { + if (ts->len == l && (memcmp(str, ts->str, l) == 0)) + return ts; + } + /* not found */ + ts = (TString *)luaM_malloc(L, sizestring(l)); + ts->marked = 0; + ts->nexthash = NULL; + ts->len = l; + ts->u.s.hash = h; + ts->u.s.constindex = 0; + memcpy(ts->str, str, l); + ts->str[l] = 0; /* ending 0 */ + L->nblocks += sizestring(l); + newentry(L, &L->strt, ts, h1); /* insert it on table */ + return ts; +} + + +TString *luaS_newudata (lua_State *L, size_t s, void *udata) { + union L_UTString *uts = (union L_UTString *)luaM_malloc(L, + (lint32)sizeof(union L_UTString)+s); + TString *ts = &uts->ts; + ts->marked = 0; + ts->nexthash = NULL; + ts->len = s; + ts->u.d.tag = 0; + ts->u.d.value = (s > 0) ? uts+1 : udata; + L->nblocks += sizestring(s); + /* insert it on table */ + newentry(L, &L->udt, ts, IntPoint(ts->u.d.value) & (L->udt.size-1)); + return ts; +} + + +TString *luaS_createudata (lua_State *L, void *udata, int tag) { + int h1 = IntPoint(udata) & (L->udt.size-1); + TString *ts; + for (ts = L->udt.hash[h1]; ts; ts = ts->nexthash) { + if (udata == ts->u.d.value && (tag == ts->u.d.tag || tag == LUA_ANYTAG)) + return ts; + } + /* not found */ + ts = luaS_newudata(L, 0, udata); + if (tag != LUA_ANYTAG) + ts->u.d.tag = tag; + return ts; +} + + +TString *luaS_new (lua_State *L, const char *str) { + return luaS_newlstr(L, str, strlen(str)); +} + + +TString *luaS_newfixed (lua_State *L, const char *str) { + TString *ts = luaS_new(L, str); + if (ts->marked == 0) ts->marked = FIXMARK; /* avoid GC */ + return ts; +} + diff --git a/build/premake/src/Src/Lua/lstring.h b/build/premake/src/Src/Lua/lstring.h new file mode 100644 index 0000000000..fe1eb79215 --- /dev/null +++ b/build/premake/src/Src/Lua/lstring.h @@ -0,0 +1,37 @@ +/* +** $Id: lstring.h,v 1.1 2003/01/24 16:26:13 jason379 Exp $ +** String table (keep all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#ifndef lstring_h +#define lstring_h + + +#include "lobject.h" +#include "lstate.h" + + +/* +** any TString with mark>=FIXMARK is never collected. +** Marks>=RESERVEDMARK are used to identify reserved words. +*/ +#define FIXMARK 2 +#define RESERVEDMARK 3 + + +#define sizestring(l) ((long)sizeof(TString) + \ + ((long)(l+1)-TSPACK)*(long)sizeof(char)) + + +void luaS_init (lua_State *L); +void luaS_resize (lua_State *L, stringtable *tb, int newsize); +TString *luaS_newudata (lua_State *L, size_t s, void *udata); +TString *luaS_createudata (lua_State *L, void *udata, int tag); +void luaS_freeall (lua_State *L); +TString *luaS_newlstr (lua_State *L, const char *str, size_t l); +TString *luaS_new (lua_State *L, const char *str); +TString *luaS_newfixed (lua_State *L, const char *str); + + +#endif diff --git a/build/premake/src/Src/Lua/lstrlib.c b/build/premake/src/Src/Lua/lstrlib.c new file mode 100644 index 0000000000..2340171a86 --- /dev/null +++ b/build/premake/src/Src/Lua/lstrlib.c @@ -0,0 +1,621 @@ +/* +** $Id: lstrlib.c,v 1.1 2003/04/23 12:16:05 jason379 Exp $ +** Standard library for string operations and pattern-matching +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + +static int str_len (lua_State *L) { + size_t l; + luaL_check_lstr(L, 1, &l); + lua_pushnumber(L, l); + return 1; +} + + +static long posrelat (long pos, size_t len) { + /* relative string position: negative means back from end */ + return (pos>=0) ? pos : (long)len+pos+1; +} + + +static int str_sub (lua_State *L) { + size_t l; + const char *s = luaL_check_lstr(L, 1, &l); + long start = posrelat(luaL_check_long(L, 2), l); + long end = posrelat(luaL_opt_long(L, 3, -1), l); + if (start < 1) start = 1; + if (end > (long)l) end = l; + if (start <= end) + lua_pushlstring(L, s+start-1, end-start+1); + else lua_pushstring(L, ""); + return 1; +} + + +static int str_lower (lua_State *L) { + size_t l; + size_t i; + luaL_Buffer b; + const char *s = luaL_check_lstr(L, 1, &l); + luaL_buffinit(L, &b); + for (i=0; i 0) + luaL_addlstring(&b, s, l); + luaL_pushresult(&b); + return 1; +} + + +static int str_byte (lua_State *L) { + size_t l; + const char *s = luaL_check_lstr(L, 1, &l); + long pos = posrelat(luaL_opt_long(L, 2, 1), l); + luaL_arg_check(L, 0level && cap->capture[l].len != -1)) + lua_error(L, "invalid capture index"); + return l; +} + + +static int capture_to_close (lua_State *L, struct Capture *cap) { + int level = cap->level; + for (level--; level>=0; level--) + if (cap->capture[level].len == -1) return level; + lua_error(L, "invalid pattern capture"); + return 0; /* to avoid warnings */ +} + + +const char *luaI_classend (lua_State *L, const char *p) { + switch (*p++) { + case ESC: + if (*p == '\0') lua_error(L, "malformed pattern (ends with `%')"); + return p+1; + case '[': + if (*p == '^') p++; + do { /* look for a ']' */ + if (*p == '\0') lua_error(L, "malformed pattern (missing `]')"); + if (*(p++) == ESC && *p != '\0') p++; /* skip escapes (e.g. '%]') */ + } while (*p != ']'); + return p+1; + default: + return p; + } +} + + +static int match_class (int c, int cl) { + int res; + switch (tolower(cl)) { + case 'a' : res = isalpha(c); break; + case 'c' : res = iscntrl(c); break; + case 'd' : res = isdigit(c); break; + case 'l' : res = islower(c); break; + case 'p' : res = ispunct(c); break; + case 's' : res = isspace(c); break; + case 'u' : res = isupper(c); break; + case 'w' : res = isalnum(c); break; + case 'x' : res = isxdigit(c); break; + case 'z' : res = (c == '\0'); break; + default: return (cl == c); + } + return (islower(cl) ? res : !res); +} + + + +static int matchbracketclass (int c, const char *p, const char *endclass) { + int sig = 1; + if (*(p+1) == '^') { + sig = 0; + p++; /* skip the '^' */ + } + while (++p < endclass) { + if (*p == ESC) { + p++; + if (match_class(c, (unsigned char)*p)) + return sig; + } + else if ((*(p+1) == '-') && (p+2 < endclass)) { + p+=2; + if ((int)(unsigned char)*(p-2) <= c && c <= (int)(unsigned char)*p) + return sig; + } + else if ((int)(unsigned char)*p == c) return sig; + } + return !sig; +} + + + +int luaI_singlematch (int c, const char *p, const char *ep) { + switch (*p) { + case '.': /* matches any char */ + return 1; + case ESC: + return match_class(c, (unsigned char)*(p+1)); + case '[': + return matchbracketclass(c, p, ep-1); + default: + return ((unsigned char)*p == c); + } +} + + +static const char *match (lua_State *L, const char *s, const char *p, + struct Capture *cap); + + +static const char *matchbalance (lua_State *L, const char *s, const char *p, + struct Capture *cap) { + if (*p == 0 || *(p+1) == 0) + lua_error(L, "unbalanced pattern"); + if (*s != *p) return NULL; + else { + int b = *p; + int e = *(p+1); + int cont = 1; + while (++s < cap->src_end) { + if (*s == e) { + if (--cont == 0) return s+1; + } + else if (*s == b) cont++; + } + } + return NULL; /* string ends out of balance */ +} + + +static const char *max_expand (lua_State *L, const char *s, const char *p, + const char *ep, struct Capture *cap) { + long i = 0; /* counts maximum expand for item */ + while ((s+i)src_end && luaI_singlematch((unsigned char)*(s+i), p, ep)) + i++; + /* keeps trying to match with the maximum repetitions */ + while (i>=0) { + const char *res = match(L, (s+i), ep+1, cap); + if (res) return res; + i--; /* else didn't match; reduce 1 repetition to try again */ + } + return NULL; +} + + +static const char *min_expand (lua_State *L, const char *s, const char *p, + const char *ep, struct Capture *cap) { + for (;;) { + const char *res = match(L, s, ep+1, cap); + if (res != NULL) + return res; + else if (ssrc_end && luaI_singlematch((unsigned char)*s, p, ep)) + s++; /* try with one more repetition */ + else return NULL; + } +} + + +static const char *start_capture (lua_State *L, const char *s, const char *p, + struct Capture *cap) { + const char *res; + int level = cap->level; + if (level >= MAX_CAPTURES) lua_error(L, "too many captures"); + cap->capture[level].init = s; + cap->capture[level].len = -1; + cap->level = level+1; + if ((res=match(L, s, p+1, cap)) == NULL) /* match failed? */ + cap->level--; /* undo capture */ + return res; +} + + +static const char *end_capture (lua_State *L, const char *s, const char *p, + struct Capture *cap) { + int l = capture_to_close(L, cap); + const char *res; + cap->capture[l].len = s - cap->capture[l].init; /* close capture */ + if ((res = match(L, s, p+1, cap)) == NULL) /* match failed? */ + cap->capture[l].len = -1; /* undo capture */ + return res; +} + + +static const char *match_capture (lua_State *L, const char *s, int level, + struct Capture *cap) { + int l = check_capture(L, level, cap); + size_t len = cap->capture[l].len; + if ((size_t)(cap->src_end-s) >= len && + memcmp(cap->capture[l].init, s, len) == 0) + return s+len; + else return NULL; +} + + +static const char *match (lua_State *L, const char *s, const char *p, + struct Capture *cap) { + init: /* using goto's to optimize tail recursion */ + switch (*p) { + case '(': /* start capture */ + return start_capture(L, s, p, cap); + case ')': /* end capture */ + return end_capture(L, s, p, cap); + case ESC: /* may be %[0-9] or %b */ + if (isdigit((unsigned char)(*(p+1)))) { /* capture? */ + s = match_capture(L, s, *(p+1), cap); + if (s == NULL) return NULL; + p+=2; goto init; /* else return match(L, s, p+2, cap) */ + } + else if (*(p+1) == 'b') { /* balanced string? */ + s = matchbalance(L, s, p+2, cap); + if (s == NULL) return NULL; + p+=4; goto init; /* else return match(L, s, p+4, cap); */ + } + else goto dflt; /* case default */ + case '\0': /* end of pattern */ + return s; /* match succeeded */ + case '$': + if (*(p+1) == '\0') /* is the '$' the last char in pattern? */ + return (s == cap->src_end) ? s : NULL; /* check end of string */ + else goto dflt; + default: dflt: { /* it is a pattern item */ + const char *ep = luaI_classend(L, p); /* points to what is next */ + int m = ssrc_end && luaI_singlematch((unsigned char)*s, p, ep); + switch (*ep) { + case '?': { /* optional */ + const char *res; + if (m && ((res=match(L, s+1, ep+1, cap)) != NULL)) + return res; + p=ep+1; goto init; /* else return match(L, s, ep+1, cap); */ + } + case '*': /* 0 or more repetitions */ + return max_expand(L, s, p, ep, cap); + case '+': /* 1 or more repetitions */ + return (m ? max_expand(L, s+1, p, ep, cap) : NULL); + case '-': /* 0 or more repetitions (minimum) */ + return min_expand(L, s, p, ep, cap); + default: + if (!m) return NULL; + s++; p=ep; goto init; /* else return match(L, s+1, ep, cap); */ + } + } + } +} + + + +static const char *lmemfind (const char *s1, size_t l1, + const char *s2, size_t l2) { + if (l2 == 0) return s1; /* empty strings are everywhere */ + else if (l2 > l1) return NULL; /* avoids a negative `l1' */ + else { + const char *init; /* to search for a `*s2' inside `s1' */ + l2--; /* 1st char will be checked by `memchr' */ + l1 = l1-l2; /* `s2' cannot be found after that */ + while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { + init++; /* 1st char is already checked */ + if (memcmp(init, s2+1, l2) == 0) + return init-1; + else { /* correct `l1' and `s1' to try again */ + l1 -= init-s1; + s1 = init; + } + } + return NULL; /* not found */ + } +} + + +static int push_captures (lua_State *L, struct Capture *cap) { + int i; + luaL_checkstack(L, cap->level, "too many captures"); + for (i=0; ilevel; i++) { + int l = cap->capture[i].len; + if (l == -1) lua_error(L, "unfinished capture"); + lua_pushlstring(L, cap->capture[i].init, l); + } + return cap->level; /* number of strings pushed */ +} + + +static int str_find (lua_State *L) { + size_t l1, l2; + const char *s = luaL_check_lstr(L, 1, &l1); + const char *p = luaL_check_lstr(L, 2, &l2); + long init = posrelat(luaL_opt_long(L, 3, 1), l1) - 1; + struct Capture cap; + luaL_arg_check(L, 0 <= init && (size_t)init <= l1, 3, "out of range"); + if (lua_gettop(L) > 3 || /* extra argument? */ + strpbrk(p, SPECIALS) == NULL) { /* or no special characters? */ + const char *s2 = lmemfind(s+init, l1-init, p, l2); + if (s2) { + lua_pushnumber(L, s2-s+1); + lua_pushnumber(L, s2-s+l2); + return 2; + } + } + else { + int anchor = (*p == '^') ? (p++, 1) : 0; + const char *s1=s+init; + cap.src_end = s+l1; + do { + const char *res; + cap.level = 0; + if ((res=match(L, s1, p, &cap)) != NULL) { + lua_pushnumber(L, s1-s+1); /* start */ + lua_pushnumber(L, res-s); /* end */ + return push_captures(L, &cap) + 2; + } + } while (s1++capture[level].init, cap->capture[level].len); + } + } + } + } + else { /* is a function */ + int n; + lua_pushvalue(L, 3); + n = push_captures(L, cap); + lua_rawcall(L, n, 1); + if (lua_isstring(L, -1)) + luaL_addvalue(b); /* add return to accumulated result */ + else + lua_pop(L, 1); /* function result is not a string: pop it */ + } +} + + +static int str_gsub (lua_State *L) { + size_t srcl; + const char *src = luaL_check_lstr(L, 1, &srcl); + const char *p = luaL_check_string(L, 2); + int max_s = luaL_opt_int(L, 4, srcl+1); + int anchor = (*p == '^') ? (p++, 1) : 0; + int n = 0; + struct Capture cap; + luaL_Buffer b; + luaL_arg_check(L, + lua_gettop(L) >= 3 && (lua_isstring(L, 3) || lua_isfunction(L, 3)), + 3, "string or function expected"); + luaL_buffinit(L, &b); + cap.src_end = src+srcl; + while (n < max_s) { + const char *e; + cap.level = 0; + e = match(L, src, p, &cap); + if (e) { + n++; + add_s(L, &b, &cap); + } + if (e && e>src) /* non empty match? */ + src = e; /* skip it */ + else if (src < cap.src_end) + luaL_putchar(&b, *src++); + else break; + if (anchor) break; + } + luaL_addlstring(&b, src, cap.src_end-src); + luaL_pushresult(&b); + lua_pushnumber(L, n); /* number of substitutions */ + return 2; +} + +/* }====================================================== */ + + +static void luaI_addquoted (lua_State *L, luaL_Buffer *b, int arg) { + size_t l; + const char *s = luaL_check_lstr(L, arg, &l); + luaL_putchar(b, '"'); + while (l--) { + switch (*s) { + case '"': case '\\': case '\n': + luaL_putchar(b, '\\'); + luaL_putchar(b, *s); + break; + case '\0': luaL_addlstring(b, "\\000", 4); break; + default: luaL_putchar(b, *s); + } + s++; + } + luaL_putchar(b, '"'); +} + +/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ +#define MAX_ITEM 512 +/* maximum size of each format specification (such as '%-099.99d') */ +#define MAX_FORMAT 20 + +static int str_format (lua_State *L) { + int arg = 1; + const char *strfrmt = luaL_check_string(L, arg); + luaL_Buffer b; + luaL_buffinit(L, &b); + while (*strfrmt) { + if (*strfrmt != '%') + luaL_putchar(&b, *strfrmt++); + else if (*++strfrmt == '%') + luaL_putchar(&b, *strfrmt++); /* %% */ + else { /* format item */ + struct Capture cap; + char form[MAX_FORMAT]; /* to store the format ('%...') */ + char buff[MAX_ITEM]; /* to store the formatted item */ + const char *initf = strfrmt; + form[0] = '%'; + if (isdigit((unsigned char)*initf) && *(initf+1) == '$') { + arg = *initf - '0'; + initf += 2; /* skip the 'n$' */ + } + arg++; + cap.src_end = strfrmt+strlen(strfrmt)+1; + cap.level = 0; + strfrmt = match(L, initf, "[-+ #0]*(%d*)%.?(%d*)", &cap); + if (cap.capture[0].len > 2 || cap.capture[1].len > 2 || /* < 100? */ + strfrmt-initf > MAX_FORMAT-2) + lua_error(L, "invalid format (width or precision too long)"); + strncpy(form+1, initf, strfrmt-initf+1); /* +1 to include conversion */ + form[strfrmt-initf+2] = 0; + switch (*strfrmt++) { + case 'c': case 'd': case 'i': + sprintf(buff, form, luaL_check_int(L, arg)); + break; + case 'o': case 'u': case 'x': case 'X': + sprintf(buff, form, (unsigned int)luaL_check_number(L, arg)); + break; + case 'e': case 'E': case 'f': case 'g': case 'G': + sprintf(buff, form, luaL_check_number(L, arg)); + break; + case 'q': + luaI_addquoted(L, &b, arg); + continue; /* skip the "addsize" at the end */ + case 's': { + size_t l; + const char *s = luaL_check_lstr(L, arg, &l); + if (cap.capture[1].len == 0 && l >= 100) { + /* no precision and string is too long to be formatted; + keep original string */ + lua_pushvalue(L, arg); + luaL_addvalue(&b); + continue; /* skip the "addsize" at the end */ + } + else { + sprintf(buff, form, s); + break; + } + } + default: /* also treat cases 'pnLlh' */ + lua_error(L, "invalid option in `format'"); + } + luaL_addlstring(&b, buff, strlen(buff)); + } + } + luaL_pushresult(&b); + return 1; +} + + +static const struct luaL_reg strlib[] = { +{"strlen", str_len}, +{"strsub", str_sub}, +{"strlower", str_lower}, +{"strupper", str_upper}, +{"strchar", str_char}, +{"strrep", str_rep}, +{"ascii", str_byte}, /* for compatibility with 3.0 and earlier */ +{"strbyte", str_byte}, +{"format", str_format}, +{"strfind", str_find}, +{"gsub", str_gsub} +}; + + +/* +** Open string library +*/ +LUALIB_API void lua_strlibopen (lua_State *L) { + luaL_openl(L, strlib); +} diff --git a/build/premake/src/Src/Lua/ltable.c b/build/premake/src/Src/Lua/ltable.c new file mode 100644 index 0000000000..51e6dfe626 --- /dev/null +++ b/build/premake/src/Src/Lua/ltable.c @@ -0,0 +1,303 @@ +/* +** $Id: ltable.c,v 1.1 2003/01/24 16:26:13 jason379 Exp $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + + +/* +** Implementation of tables (aka arrays, objects, or hash tables); +** uses a mix of chained scatter table with Brent's variation. +** A main invariant of these tables is that, if an element is not +** in its main position (i.e. the `original' position that its hash gives +** to it), then the colliding element is in its own main position. +** In other words, there are collisions only when two elements have the +** same main position (i.e. the same hash values for that table size). +** Because of that, the load factor of these tables can be 100% without +** performance penalties. +*/ + + +#include "lua.h" + +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" + + +#define gcsize(L, n) (sizeof(Hash)+(n)*sizeof(Node)) + + + +#define TagDefault LUA_TTABLE + + + +/* +** returns the `main' position of an element in a table (that is, the index +** of its hash value) +*/ +Node *luaH_mainposition (const Hash *t, const TObject *key) { + unsigned long h; + switch (ttype(key)) { + case LUA_TNUMBER: + h = (unsigned long)(long)nvalue(key); + break; + case LUA_TSTRING: + h = tsvalue(key)->u.s.hash; + break; + case LUA_TUSERDATA: + h = IntPoint(tsvalue(key)); + break; + case LUA_TTABLE: + h = IntPoint(hvalue(key)); + break; + case LUA_TFUNCTION: + h = IntPoint(clvalue(key)); + break; + default: + return NULL; /* invalid key */ + } + LUA_ASSERT(h%(unsigned int)t->size == (h&((unsigned int)t->size-1)), + "a&(x-1) == a%x, for x power of 2"); + return &t->node[h&(t->size-1)]; +} + + +static const TObject *luaH_getany (lua_State *L, const Hash *t, + const TObject *key) { + Node *n = luaH_mainposition(t, key); + if (!n) + lua_error(L, "table index is nil"); + else do { + if (luaO_equalObj(key, &n->key)) + return &n->val; + n = n->next; + } while (n); + return &luaO_nilobject; /* key not found */ +} + + +/* specialized version for numbers */ +const TObject *luaH_getnum (const Hash *t, Number key) { + Node *n = &t->node[(unsigned long)(long)key&(t->size-1)]; + do { + if (ttype(&n->key) == LUA_TNUMBER && nvalue(&n->key) == key) + return &n->val; + n = n->next; + } while (n); + return &luaO_nilobject; /* key not found */ +} + + +/* specialized version for strings */ +const TObject *luaH_getstr (const Hash *t, TString *key) { + Node *n = &t->node[key->u.s.hash&(t->size-1)]; + do { + if (ttype(&n->key) == LUA_TSTRING && tsvalue(&n->key) == key) + return &n->val; + n = n->next; + } while (n); + return &luaO_nilobject; /* key not found */ +} + + +const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key) { + switch (ttype(key)) { + case LUA_TNUMBER: return luaH_getnum(t, nvalue(key)); + case LUA_TSTRING: return luaH_getstr(t, tsvalue(key)); + default: return luaH_getany(L, t, key); + } +} + + +Node *luaH_next (lua_State *L, const Hash *t, const TObject *key) { + int i; + if (ttype(key) == LUA_TNIL) + i = 0; /* first iteration */ + else { + const TObject *v = luaH_get(L, t, key); + if (v == &luaO_nilobject) + lua_error(L, "invalid key for `next'"); + i = (int)(((const char *)v - + (const char *)(&t->node[0].val)) / sizeof(Node)) + 1; + } + for (; isize; i++) { + Node *n = node(t, i); + if (ttype(val(n)) != LUA_TNIL) + return n; + } + return NULL; /* no more elements */ +} + + +/* +** try to remove a key without value from a table. To avoid problems with +** hash, change `key' for a number with the same hash. +*/ +void luaH_remove (Hash *t, TObject *key) { + if (ttype(key) == LUA_TNUMBER || + (ttype(key) == LUA_TSTRING && tsvalue(key)->len <= 30)) + return; /* do not remove numbers nor small strings */ + else { + /* try to find a number `n' with the same hash as `key' */ + Node *mp = luaH_mainposition(t, key); + int n = mp - &t->node[0]; + /* make sure `n' is not in `t' */ + while (luaH_getnum(t, n) != &luaO_nilobject) { + if (n >= MAX_INT - t->size) + return; /* give up; (to avoid overflow) */ + n += t->size; + } + ttype(key) = LUA_TNUMBER; + nvalue(key) = n; + LUA_ASSERT(luaH_mainposition(t, key) == mp, "cannot change hash"); + } +} + + +static void setnodevector (lua_State *L, Hash *t, lint32 size) { + int i; + if (size > MAX_INT) + lua_error(L, "table overflow"); + t->node = luaM_newvector(L, size, Node); + for (i=0; i<(int)size; i++) { + ttype(&t->node[i].key) = ttype(&t->node[i].val) = LUA_TNIL; + t->node[i].next = NULL; + } + L->nblocks += gcsize(L, size) - gcsize(L, t->size); + t->size = size; + t->firstfree = &t->node[size-1]; /* first free position to be used */ +} + + +Hash *luaH_new (lua_State *L, int size) { + Hash *t = luaM_new(L, Hash); + t->htag = TagDefault; + t->next = L->roottable; + L->roottable = t; + t->mark = t; + t->size = 0; + L->nblocks += gcsize(L, 0); + t->node = NULL; + setnodevector(L, t, luaO_power2(size)); + return t; +} + + +void luaH_free (lua_State *L, Hash *t) { + L->nblocks -= gcsize(L, t->size); + luaM_free(L, t->node); + luaM_free(L, t); +} + + +static int numuse (const Hash *t) { + Node *v = t->node; + int size = t->size; + int realuse = 0; + int i; + for (i=0; isize; + Node *nold = t->node; + int nelems = numuse(t); + int i; + LUA_ASSERT(nelems<=oldsize, "wrong count"); + if (nelems >= oldsize-oldsize/4) /* using more than 3/4? */ + setnodevector(L, t, (lint32)oldsize*2); + else if (nelems <= oldsize/4 && /* less than 1/4? */ + oldsize > MINPOWER2) + setnodevector(L, t, oldsize/2); + else + setnodevector(L, t, oldsize); + for (i=0; ival) != LUA_TNIL) + *luaH_set(L, t, &old->key) = old->val; + } + luaM_free(L, nold); /* free old array */ +} + + +/* +** inserts a key into a hash table; first, check whether key is +** already present; if not, check whether key's main position is free; +** if not, check whether colliding node is in its main position or not; +** if it is not, move colliding node to an empty place and put new key +** in its main position; otherwise (colliding node is in its main position), +** new key goes to an empty position. +*/ +TObject *luaH_set (lua_State *L, Hash *t, const TObject *key) { + Node *mp = luaH_mainposition(t, key); + Node *n = mp; + if (!mp) + lua_error(L, "table index is nil"); + do { /* check whether `key' is somewhere in the chain */ + if (luaO_equalObj(key, &n->key)) + return &n->val; /* that's all */ + else n = n->next; + } while (n); + /* `key' not found; must insert it */ + if (ttype(&mp->key) != LUA_TNIL) { /* main position is not free? */ + Node *othern; /* main position of colliding node */ + n = t->firstfree; /* get a free place */ + /* is colliding node out of its main position? (can only happens if + its position is after "firstfree") */ + if (mp > n && (othern=luaH_mainposition(t, &mp->key)) != mp) { + /* yes; move colliding node into free position */ + while (othern->next != mp) othern = othern->next; /* find previous */ + othern->next = n; /* redo the chain with `n' in place of `mp' */ + *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ + mp->next = NULL; /* now `mp' is free */ + } + else { /* colliding node is in its own main position */ + /* new node will go into free position */ + n->next = mp->next; /* chain new position */ + mp->next = n; + mp = n; + } + } + mp->key = *key; + for (;;) { /* correct `firstfree' */ + if (ttype(&t->firstfree->key) == LUA_TNIL) + return &mp->val; /* OK; table still has a free place */ + else if (t->firstfree == t->node) break; /* cannot decrement from here */ + else (t->firstfree)--; + } + rehash(L, t); /* no more free places */ + return luaH_set(L, t, key); /* `rehash' invalidates this insertion */ +} + + +TObject *luaH_setint (lua_State *L, Hash *t, int key) { + TObject index; + ttype(&index) = LUA_TNUMBER; + nvalue(&index) = key; + return luaH_set(L, t, &index); +} + + +void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val) { + TObject *value, index; + ttype(&index) = LUA_TSTRING; + tsvalue(&index) = key; + value = luaH_set(L, t, &index); + ttype(value) = LUA_TNUMBER; + nvalue(value) = val; +} + + +const TObject *luaH_getglobal (lua_State *L, const char *name) { + return luaH_getstr(L->gt, luaS_new(L, name)); +} + diff --git a/build/premake/src/Src/Lua/ltable.h b/build/premake/src/Src/Lua/ltable.h new file mode 100644 index 0000000000..f7c6bbae23 --- /dev/null +++ b/build/premake/src/Src/Lua/ltable.h @@ -0,0 +1,34 @@ +/* +** $Id: ltable.h,v 1.1 2003/01/24 16:26:15 jason379 Exp $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#ifndef ltable_h +#define ltable_h + +#include "lobject.h" + + +#define node(t,i) (&(t)->node[i]) +#define key(n) (&(n)->key) +#define val(n) (&(n)->val) + +Hash *luaH_new (lua_State *L, int nhash); +void luaH_free (lua_State *L, Hash *t); +const TObject *luaH_get (lua_State *L, const Hash *t, const TObject *key); +const TObject *luaH_getnum (const Hash *t, Number key); +const TObject *luaH_getstr (const Hash *t, TString *key); +void luaH_remove (Hash *t, TObject *key); +TObject *luaH_set (lua_State *L, Hash *t, const TObject *key); +Node * luaH_next (lua_State *L, const Hash *t, const TObject *r); +TObject *luaH_setint (lua_State *L, Hash *t, int key); +void luaH_setstrnum (lua_State *L, Hash *t, TString *key, Number val); +unsigned long luaH_hash (lua_State *L, const TObject *key); +const TObject *luaH_getglobal (lua_State *L, const char *name); + +/* exported only for debugging */ +Node *luaH_mainposition (const Hash *t, const TObject *key); + + +#endif diff --git a/build/premake/src/Src/Lua/ltests.c b/build/premake/src/Src/Lua/ltests.c new file mode 100644 index 0000000000..18e51ca9ce --- /dev/null +++ b/build/premake/src/Src/Lua/ltests.c @@ -0,0 +1,543 @@ +/* +** $Id: ltests.c,v 1.1 2003/01/24 16:26:16 jason379 Exp $ +** Internal Module for Debugging of the Lua Implementation +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include + + +#include "lua.h" + +#include "lapi.h" +#include "lauxlib.h" +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "luadebug.h" +#include "lualib.h" + + +void luaB_opentests (lua_State *L); + + +/* +** The whole module only makes sense with LUA_DEBUG on +*/ +#ifdef LUA_DEBUG + + + +static void setnameval (lua_State *L, const char *name, int val) { + lua_pushstring(L, name); + lua_pushnumber(L, val); + lua_settable(L, -3); +} + + +/* +** {====================================================== +** Disassembler +** ======================================================= +*/ + + +static const char *const instrname[NUM_OPCODES] = { + "END", "RETURN", "CALL", "TAILCALL", "PUSHNIL", "POP", "PUSHINT", + "PUSHSTRING", "PUSHNUM", "PUSHNEGNUM", "PUSHUPVALUE", "GETLOCAL", + "GETGLOBAL", "GETTABLE", "GETDOTTED", "GETINDEXED", "PUSHSELF", + "CREATETABLE", "SETLOCAL", "SETGLOBAL", "SETTABLE", "SETLIST", "SETMAP", + "ADD", "ADDI", "SUB", "MULT", "DIV", "POW", "CONCAT", "MINUS", "NOT", + "JMPNE", "JMPEQ", "JMPLT", "JMPLE", "JMPGT", "JMPGE", "JMPT", "JMPF", + "JMPONT", "JMPONF", "JMP", "PUSHNILJMP", "FORPREP", "FORLOOP", "LFORPREP", + "LFORLOOP", "CLOSURE" +}; + + +static int pushop (lua_State *L, Proto *p, int pc) { + char buff[100]; + Instruction i = p->code[pc]; + OpCode o = GET_OPCODE(i); + const char *name = instrname[o]; + sprintf(buff, "%5d - ", luaG_getline(p->lineinfo, pc, 1, NULL)); + switch ((enum Mode)luaK_opproperties[o].mode) { + case iO: + sprintf(buff+8, "%-12s", name); + break; + case iU: + sprintf(buff+8, "%-12s%4u", name, GETARG_U(i)); + break; + case iS: + sprintf(buff+8, "%-12s%4d", name, GETARG_S(i)); + break; + case iAB: + sprintf(buff+8, "%-12s%4d %4d", name, GETARG_A(i), GETARG_B(i)); + break; + } + lua_pushstring(L, buff); + return (o != OP_END); +} + + +static int listcode (lua_State *L) { + int pc; + Proto *p; + int res; + luaL_arg_check(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), + 1, "Lua function expected"); + p = clvalue(luaA_index(L, 1))->f.l; + lua_newtable(L); + setnameval(L, "maxstack", p->maxstacksize); + setnameval(L, "numparams", p->numparams); + pc = 0; + do { + lua_pushnumber(L, pc+1); + res = pushop(L, p, pc++); + lua_settable(L, -3); + } while (res); + return 1; +} + + +static int liststrings (lua_State *L) { + Proto *p; + int i; + luaL_arg_check(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), + 1, "Lua function expected"); + p = clvalue(luaA_index(L, 1))->f.l; + lua_newtable(L); + for (i=0; inkstr; i++) { + lua_pushnumber(L, i+1); + lua_pushstring(L, p->kstr[i]->str); + lua_settable(L, -3); + } + return 1; +} + + +static int listlocals (lua_State *L) { + Proto *p; + int pc = luaL_check_int(L, 2) - 1; + int i = 0; + const char *name; + luaL_arg_check(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), + 1, "Lua function expected"); + p = clvalue(luaA_index(L, 1))->f.l; + while ((name = luaF_getlocalname(p, ++i, pc)) != NULL) + lua_pushstring(L, name); + return i-1; +} + +/* }====================================================== */ + + + +static int get_limits (lua_State *L) { + lua_newtable(L); + setnameval(L, "BITS_INT", BITS_INT); + setnameval(L, "LFPF", LFIELDS_PER_FLUSH); + setnameval(L, "MAXARG_A", MAXARG_A); + setnameval(L, "MAXARG_B", MAXARG_B); + setnameval(L, "MAXARG_S", MAXARG_S); + setnameval(L, "MAXARG_U", MAXARG_U); + setnameval(L, "MAXLOCALS", MAXLOCALS); + setnameval(L, "MAXPARAMS", MAXPARAMS); + setnameval(L, "MAXSTACK", MAXSTACK); + setnameval(L, "MAXUPVALUES", MAXUPVALUES); + setnameval(L, "MAXVARSLH", MAXVARSLH); + setnameval(L, "RFPF", RFIELDS_PER_FLUSH); + setnameval(L, "SIZE_A", SIZE_A); + setnameval(L, "SIZE_B", SIZE_B); + setnameval(L, "SIZE_OP", SIZE_OP); + setnameval(L, "SIZE_U", SIZE_U); + return 1; +} + + +static int mem_query (lua_State *L) { + if (lua_isnull(L, 1)) { + lua_pushnumber(L, memdebug_total); + lua_pushnumber(L, memdebug_numblocks); + lua_pushnumber(L, memdebug_maxmem); + return 3; + } + else { + memdebug_memlimit = luaL_check_int(L, 1); + return 0; + } +} + + +static int hash_query (lua_State *L) { + if (lua_isnull(L, 2)) { + luaL_arg_check(L, lua_tag(L, 1) == LUA_TSTRING, 1, "string expected"); + lua_pushnumber(L, tsvalue(luaA_index(L, 1))->u.s.hash); + } + else { + Hash *t; + luaL_checktype(L, 2, LUA_TTABLE); + t = hvalue(luaA_index(L, 2)); + lua_pushnumber(L, luaH_mainposition(t, luaA_index(L, 1)) - t->node); + } + return 1; +} + + +static int table_query (lua_State *L) { + const Hash *t; + int i = luaL_opt_int(L, 2, -1); + luaL_checktype(L, 1, LUA_TTABLE); + t = hvalue(luaA_index(L, 1)); + if (i == -1) { + lua_pushnumber(L, t->size); + lua_pushnumber(L, t->firstfree - t->node); + return 2; + } + else if (i < t->size) { + luaA_pushobject(L, &t->node[i].key); + luaA_pushobject(L, &t->node[i].val); + if (t->node[i].next) { + lua_pushnumber(L, t->node[i].next - t->node); + return 3; + } + else + return 2; + } + return 0; +} + + +static int string_query (lua_State *L) { + stringtable *tb = (*luaL_check_string(L, 1) == 's') ? &L->strt : &L->udt; + int s = luaL_opt_int(L, 2, 0) - 1; + if (s==-1) { + lua_pushnumber(L ,tb->nuse); + lua_pushnumber(L ,tb->size); + return 2; + } + else if (s < tb->size) { + TString *ts; + int n = 0; + for (ts = tb->hash[s]; ts; ts = ts->nexthash) { + ttype(L->top) = LUA_TSTRING; + tsvalue(L->top) = ts; + incr_top; + n++; + } + return n; + } + return 0; +} + + +static int tref (lua_State *L) { + luaL_checkany(L, 1); + lua_pushvalue(L, 1); + lua_pushnumber(L, lua_ref(L, luaL_opt_int(L, 2, 1))); + return 1; +} + +static int getref (lua_State *L) { + if (lua_getref(L, luaL_check_int(L, 1))) + return 1; + else + return 0; +} + +static int unref (lua_State *L) { + lua_unref(L, luaL_check_int(L, 1)); + return 0; +} + +static int newuserdata (lua_State *L) { + if (lua_isnumber(L, 2)) + lua_pushusertag(L, (void *)luaL_check_int(L, 1), luaL_check_int(L, 2)); + else + lua_newuserdata(L, luaL_check_int(L, 1)); + return 1; +} + +static int udataval (lua_State *L) { + luaL_checktype(L, 1, LUA_TUSERDATA); + lua_pushnumber(L, (int)lua_touserdata(L, 1)); + return 1; +} + +static int newstate (lua_State *L) { + lua_State *L1 = lua_open(luaL_check_int(L, 1)); + if (L1) + lua_pushuserdata(L, L1); + else + lua_pushnil(L); + return 1; +} + +static int loadlib (lua_State *L) { + lua_State *L1 = (lua_State *)lua_touserdata(L, 1); + switch (*luaL_check_string(L, 2)) { + case 'm': lua_mathlibopen(L1); break; + case 's': lua_strlibopen(L1); break; + case 'i': lua_iolibopen(L1); break; + case 'd': lua_dblibopen(L1); break; + case 'b': lua_baselibopen(L1); break; + default: luaL_argerror(L, 2, "invalid option"); + } + return 0; +} + +static int closestate (lua_State *L) { + luaL_checktype(L, 1, LUA_TUSERDATA); + lua_close((lua_State *)lua_touserdata(L, 1)); + return 0; +} + +static int doremote (lua_State *L) { + lua_State *L1; + const char *code = luaL_check_string(L, 2); + int status; + luaL_checktype(L, 1, LUA_TUSERDATA); + L1 = (lua_State *)lua_touserdata(L, 1); + status = lua_dostring(L1, code); + if (status != 0) { + lua_pushnil(L); + lua_pushnumber(L, status); + return 2; + } + else { + int i = 0; + while (!lua_isnull(L1, ++i)) + lua_pushstring(L, lua_tostring(L1, i)); + return i-1; + } +} + +static int settagmethod (lua_State *L) { + int tag = luaL_check_int(L, 1); + const char *event = luaL_check_string(L, 2); + luaL_checkany(L, 3); + lua_gettagmethod(L, tag, event); + lua_pushvalue(L, 3); + lua_settagmethod(L, tag, event); + return 1; +} + +static int pushbool (lua_State *L, int b) { + if (b) lua_pushnumber(L, 1); + else lua_pushnil(L); + return 1; +} + +static int equal (lua_State *L) { + return pushbool(L, lua_equal(L, 1, 2)); +} + + + +/* +** {====================================================== +** function to test the API with C. It interprets a kind of "assembler" +** language with calls to the API, so the test can be driven by Lua code +** ======================================================= +*/ + +static const char *const delimits = " \t\n,;"; + +static void skip (const char **pc) { + while (**pc != '\0' && strchr(delimits, **pc)) (*pc)++; +} + +static int getnum (lua_State *L, const char **pc) { + int res = 0; + int sig = 1; + skip(pc); + if (**pc == '.') { + res = (int)lua_tonumber(L, -1); + lua_pop(L, 1); + (*pc)++; + return res; + } + else if (**pc == '-') { + sig = -1; + (*pc)++; + } + while (isdigit(**pc)) res = res*10 + (*(*pc)++) - '0'; + return sig*res; +} + +static const char *getname (char *buff, const char **pc) { + int i = 0; + skip(pc); + while (**pc != '\0' && !strchr(delimits, **pc)) + buff[i++] = *(*pc)++; + buff[i] = '\0'; + return buff; +} + + +#define EQ(s1) (strcmp(s1, inst) == 0) + +#define getnum ((getnum)(L, &pc)) +#define getname ((getname)(buff, &pc)) + + +static int testC (lua_State *L) { + char buff[30]; + const char *pc = luaL_check_string(L, 1); + for (;;) { + const char *inst = getname; + if EQ("") return 0; + else if EQ("isnumber") { + lua_pushnumber(L, lua_isnumber(L, getnum)); + } + else if EQ("isstring") { + lua_pushnumber(L, lua_isstring(L, getnum)); + } + else if EQ("istable") { + lua_pushnumber(L, lua_istable(L, getnum)); + } + else if EQ("iscfunction") { + lua_pushnumber(L, lua_iscfunction(L, getnum)); + } + else if EQ("isfunction") { + lua_pushnumber(L, lua_isfunction(L, getnum)); + } + else if EQ("isuserdata") { + lua_pushnumber(L, lua_isuserdata(L, getnum)); + } + else if EQ("isnil") { + lua_pushnumber(L, lua_isnil(L, getnum)); + } + else if EQ("isnull") { + lua_pushnumber(L, lua_isnull(L, getnum)); + } + else if EQ("tonumber") { + lua_pushnumber(L, lua_tonumber(L, getnum)); + } + else if EQ("tostring") { + lua_pushstring(L, lua_tostring(L, getnum)); + } + else if EQ("tonumber") { + lua_pushnumber(L, lua_tonumber(L, getnum)); + } + else if EQ("strlen") { + lua_pushnumber(L, lua_strlen(L, getnum)); + } + else if EQ("tocfunction") { + lua_pushcfunction(L, lua_tocfunction(L, getnum)); + } + else if EQ("return") { + return getnum; + } + else if EQ("gettop") { + lua_pushnumber(L, lua_gettop(L)); + } + else if EQ("settop") { + lua_settop(L, getnum); + } + else if EQ("pop") { + lua_pop(L, getnum); + } + else if EQ("pushnum") { + lua_pushnumber(L, getnum); + } + else if EQ("pushvalue") { + lua_pushvalue(L, getnum); + } + else if EQ("remove") { + lua_remove(L, getnum); + } + else if EQ("insert") { + lua_insert(L, getnum); + } + else if EQ("gettable") { + lua_gettable(L, getnum); + } + else if EQ("settable") { + lua_settable(L, getnum); + } + else if EQ("next") { + lua_next(L, -2); + } + else if EQ("concat") { + lua_concat(L, getnum); + } + else if EQ("rawcall") { + int narg = getnum; + int nres = getnum; + lua_rawcall(L, narg, nres); + } + else if EQ("call") { + int narg = getnum; + int nres = getnum; + lua_call(L, narg, nres); + } + else if EQ("dostring") { + lua_dostring(L, luaL_check_string(L, getnum)); + } + else if EQ("settagmethod") { + int tag = getnum; + const char *event = getname; + lua_settagmethod(L, tag, event); + } + else if EQ("gettagmethod") { + int tag = getnum; + const char *event = getname; + lua_gettagmethod(L, tag, event); + } + else if EQ("type") { + lua_pushstring(L, lua_typename(L, lua_type(L, getnum))); + } + else luaL_verror(L, "unknown instruction %.30s", buff); + } + return 0; +} + +/* }====================================================== */ + + + +static const struct luaL_reg tests_funcs[] = { + {"hash", hash_query}, + {"limits", get_limits}, + {"listcode", listcode}, + {"liststrings", liststrings}, + {"listlocals", listlocals}, + {"loadlib", loadlib}, + {"querystr", string_query}, + {"querytab", table_query}, + {"testC", testC}, + {"ref", tref}, + {"getref", getref}, + {"unref", unref}, + {"newuserdata", newuserdata}, + {"udataval", udataval}, + {"newstate", newstate}, + {"closestate", closestate}, + {"doremote", doremote}, + {"settagmethod", settagmethod}, + {"equal", equal}, + {"totalmem", mem_query} +}; + + +void luaB_opentests (lua_State *L) { + lua_newtable(L); + lua_getglobals(L); + lua_pushvalue(L, -2); + lua_setglobals(L); + luaL_openl(L, tests_funcs); /* open functions inside new table */ + lua_setglobals(L); /* restore old table of globals */ + lua_setglobal(L, "T"); /* set new table as global T */ +} + +#endif diff --git a/build/premake/src/Src/Lua/ltm.c b/build/premake/src/Src/Lua/ltm.c new file mode 100644 index 0000000000..25b26ccbba --- /dev/null +++ b/build/premake/src/Src/Lua/ltm.c @@ -0,0 +1,163 @@ +/* +** $Id: ltm.c,v 1.1 2003/01/24 16:26:16 jason379 Exp $ +** Tag methods +** See Copyright Notice in lua.h +*/ + + +#include +#include + +#include "lua.h" + +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "ltm.h" + + +const char *const luaT_eventname[] = { /* ORDER TM */ + "gettable", "settable", "index", "getglobal", "setglobal", "add", "sub", + "mul", "div", "pow", "unm", "lt", "concat", "gc", "function", + "le", "gt", "ge", /* deprecated options!! */ + NULL +}; + + +static int findevent (const char *name) { + int i; + for (i=0; luaT_eventname[i]; i++) + if (strcmp(luaT_eventname[i], name) == 0) + return i; + return -1; /* name not found */ +} + + +static int luaI_checkevent (lua_State *L, const char *name, int t) { + int e = findevent(name); + if (e >= TM_N) + luaO_verror(L, "event `%.50s' is deprecated", name); + if (e == TM_GC && t == LUA_TTABLE) + luaO_verror(L, "event `gc' for tables is deprecated"); + if (e < 0) + luaO_verror(L, "`%.50s' is not a valid event name", name); + return e; +} + + + +/* events in LUA_TNIL are all allowed, since this is used as a +* 'placeholder' for "default" fallbacks +*/ +/* ORDER LUA_T, ORDER TM */ +static const char luaT_validevents[NUM_TAGS][TM_N] = { + {1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_TUSERDATA */ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* LUA_TNIL */ + {1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, /* LUA_TNUMBER */ + {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_TSTRING */ + {0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_TTABLE */ + {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0} /* LUA_TFUNCTION */ +}; + +int luaT_validevent (int t, int e) { /* ORDER LUA_T */ + return (t >= NUM_TAGS) ? 1 : luaT_validevents[t][e]; +} + + +static void init_entry (lua_State *L, int tag) { + int i; + for (i=0; iTMtable[tag].collected = NULL; +} + + +void luaT_init (lua_State *L) { + int t; + luaM_growvector(L, L->TMtable, 0, NUM_TAGS, struct TM, "", MAX_INT); + L->nblocks += NUM_TAGS*sizeof(struct TM); + L->last_tag = NUM_TAGS-1; + for (t=0; t<=L->last_tag; t++) + init_entry(L, t); +} + + +LUA_API int lua_newtag (lua_State *L) { + luaM_growvector(L, L->TMtable, L->last_tag, 1, struct TM, + "tag table overflow", MAX_INT); + L->nblocks += sizeof(struct TM); + L->last_tag++; + init_entry(L, L->last_tag); + return L->last_tag; +} + + +static void checktag (lua_State *L, int tag) { + if (!(0 <= tag && tag <= L->last_tag)) + luaO_verror(L, "%d is not a valid tag", tag); +} + +void luaT_realtag (lua_State *L, int tag) { + if (!validtag(tag)) + luaO_verror(L, "tag %d was not created by `newtag'", tag); +} + + +LUA_API int lua_copytagmethods (lua_State *L, int tagto, int tagfrom) { + int e; + checktag(L, tagto); + checktag(L, tagfrom); + for (e=0; eu.d.tag; + case LUA_TTABLE: return hvalue(o)->htag; + default: return t; + } +} + + +LUA_API void lua_gettagmethod (lua_State *L, int t, const char *event) { + int e; + e = luaI_checkevent(L, event, t); + checktag(L, t); + if (luaT_validevent(t, e) && luaT_gettm(L, t, e)) { + clvalue(L->top) = luaT_gettm(L, t, e); + ttype(L->top) = LUA_TFUNCTION; + } + else + ttype(L->top) = LUA_TNIL; + incr_top; +} + + +LUA_API void lua_settagmethod (lua_State *L, int t, const char *event) { + int e = luaI_checkevent(L, event, t); + checktag(L, t); + if (!luaT_validevent(t, e)) + luaO_verror(L, "cannot change `%.20s' tag method for type `%.20s'%.20s", + luaT_eventname[e], luaO_typenames[t], + (t == LUA_TTABLE || t == LUA_TUSERDATA) ? + " with default tag" : ""); + switch (ttype(L->top - 1)) { + case LUA_TNIL: + luaT_gettm(L, t, e) = NULL; + break; + case LUA_TFUNCTION: + luaT_gettm(L, t, e) = clvalue(L->top - 1); + break; + default: + lua_error(L, "tag method must be a function (or nil)"); + } + L->top--; +} + diff --git a/build/premake/src/Src/Lua/ltm.h b/build/premake/src/Src/Lua/ltm.h new file mode 100644 index 0000000000..86edd8d215 --- /dev/null +++ b/build/premake/src/Src/Lua/ltm.h @@ -0,0 +1,59 @@ +/* +** $Id: ltm.h,v 1.1 2003/01/24 16:26:16 jason379 Exp $ +** Tag methods +** See Copyright Notice in lua.h +*/ + +#ifndef ltm_h +#define ltm_h + + +#include "lobject.h" +#include "lstate.h" + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER TM" +*/ +typedef enum { + TM_GETTABLE = 0, + TM_SETTABLE, + TM_INDEX, + TM_GETGLOBAL, + TM_SETGLOBAL, + TM_ADD, + TM_SUB, + TM_MUL, + TM_DIV, + TM_POW, + TM_UNM, + TM_LT, + TM_CONCAT, + TM_GC, + TM_FUNCTION, + TM_N /* number of elements in the enum */ +} TMS; + + +struct TM { + Closure *method[TM_N]; + TString *collected; /* list of garbage-collected udata with this tag */ +}; + + +#define luaT_gettm(L,tag,event) (L->TMtable[tag].method[event]) +#define luaT_gettmbyObj(L,o,e) (luaT_gettm((L),luaT_tag(o),(e))) + + +#define validtag(t) (NUM_TAGS <= (t) && (t) <= L->last_tag) + +extern const char *const luaT_eventname[]; + + +void luaT_init (lua_State *L); +void luaT_realtag (lua_State *L, int tag); +int luaT_tag (const TObject *o); +int luaT_validevent (int t, int e); /* used by compatibility module */ + + +#endif diff --git a/build/premake/src/Src/Lua/lua.h b/build/premake/src/Src/Lua/lua.h new file mode 100644 index 0000000000..47e69d4ce0 --- /dev/null +++ b/build/premake/src/Src/Lua/lua.h @@ -0,0 +1,248 @@ +/* +** $Id: lua.h,v 1.1 2003/01/24 16:26:17 jason379 Exp $ +** Lua - An Extensible Extension Language +** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil +** e-mail: lua@tecgraf.puc-rio.br +** www: http://www.tecgraf.puc-rio.br/lua/ +** See Copyright Notice at the end of this file +*/ + + +#ifndef lua_h +#define lua_h + + +/* definition of `size_t' */ +#include + + +/* mark for all API functions */ +#ifndef LUA_API +#define LUA_API extern +#endif + + +#define LUA_VERSION "Lua 4.0.1" +#define LUA_COPYRIGHT "Copyright (C) 1994-2000 TeCGraf, PUC-Rio" +#define LUA_AUTHORS "W. Celes, R. Ierusalimschy & L. H. de Figueiredo" + + +/* name of global variable with error handler */ +#define LUA_ERRORMESSAGE "_ERRORMESSAGE" + + +/* pre-defined references */ +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) +#define LUA_REFREGISTRY 0 + +/* pre-defined tags */ +#define LUA_ANYTAG (-1) +#define LUA_NOTAG (-2) + + +/* option for multiple returns in lua_call */ +#define LUA_MULTRET (-1) + + +/* minimum stack available for a C function */ +#define LUA_MINSTACK 20 + + +/* error codes for lua_do* */ +#define LUA_ERRRUN 1 +#define LUA_ERRFILE 2 +#define LUA_ERRSYNTAX 3 +#define LUA_ERRMEM 4 +#define LUA_ERRERR 5 + + +typedef struct lua_State lua_State; + +typedef int (*lua_CFunction) (lua_State *L); + +/* +** types returned by `lua_type' +*/ +#define LUA_TNONE (-1) + +#define LUA_TUSERDATA 0 +#define LUA_TNIL 1 +#define LUA_TNUMBER 2 +#define LUA_TSTRING 3 +#define LUA_TTABLE 4 +#define LUA_TFUNCTION 5 + + + +/* +** state manipulation +*/ +LUA_API lua_State *lua_open (int stacksize); +LUA_API void lua_close (lua_State *L); + + +/* +** basic stack manipulation +*/ +LUA_API int lua_gettop (lua_State *L); +LUA_API void lua_settop (lua_State *L, int index); +LUA_API void lua_pushvalue (lua_State *L, int index); +LUA_API void lua_remove (lua_State *L, int index); +LUA_API void lua_insert (lua_State *L, int index); +LUA_API int lua_stackspace (lua_State *L); + + +/* +** access functions (stack -> C) +*/ + +LUA_API int lua_type (lua_State *L, int index); +LUA_API const char *lua_typename (lua_State *L, int t); +LUA_API int lua_isnumber (lua_State *L, int index); +LUA_API int lua_isstring (lua_State *L, int index); +LUA_API int lua_iscfunction (lua_State *L, int index); +LUA_API int lua_tag (lua_State *L, int index); + +LUA_API int lua_equal (lua_State *L, int index1, int index2); +LUA_API int lua_lessthan (lua_State *L, int index1, int index2); + +LUA_API double lua_tonumber (lua_State *L, int index); +LUA_API const char *lua_tostring (lua_State *L, int index); +LUA_API size_t lua_strlen (lua_State *L, int index); +LUA_API lua_CFunction lua_tocfunction (lua_State *L, int index); +LUA_API void *lua_touserdata (lua_State *L, int index); +LUA_API const void *lua_topointer (lua_State *L, int index); + + +/* +** push functions (C -> stack) +*/ +LUA_API void lua_pushnil (lua_State *L); +LUA_API void lua_pushnumber (lua_State *L, double n); +LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len); +LUA_API void lua_pushstring (lua_State *L, const char *s); +LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n); +LUA_API void lua_pushusertag (lua_State *L, void *u, int tag); + + +/* +** get functions (Lua -> stack) +*/ +LUA_API void lua_getglobal (lua_State *L, const char *name); +LUA_API void lua_gettable (lua_State *L, int index); +LUA_API void lua_rawget (lua_State *L, int index); +LUA_API void lua_rawgeti (lua_State *L, int index, int n); +LUA_API void lua_getglobals (lua_State *L); +LUA_API void lua_gettagmethod (lua_State *L, int tag, const char *event); +LUA_API int lua_getref (lua_State *L, int ref); +LUA_API void lua_newtable (lua_State *L); + + +/* +** set functions (stack -> Lua) +*/ +LUA_API void lua_setglobal (lua_State *L, const char *name); +LUA_API void lua_settable (lua_State *L, int index); +LUA_API void lua_rawset (lua_State *L, int index); +LUA_API void lua_rawseti (lua_State *L, int index, int n); +LUA_API void lua_setglobals (lua_State *L); +LUA_API void lua_settagmethod (lua_State *L, int tag, const char *event); +LUA_API int lua_ref (lua_State *L, int lock); + + +/* +** "do" functions (run Lua code) +*/ +LUA_API int lua_call (lua_State *L, int nargs, int nresults); +LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults); +LUA_API int lua_dofile (lua_State *L, const char *filename); +LUA_API int lua_dostring (lua_State *L, const char *str); +LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, const char *name); + +/* +** Garbage-collection functions +*/ +LUA_API int lua_getgcthreshold (lua_State *L); +LUA_API int lua_getgccount (lua_State *L); +LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold); + +/* +** miscellaneous functions +*/ +LUA_API int lua_newtag (lua_State *L); +LUA_API int lua_copytagmethods (lua_State *L, int tagto, int tagfrom); +LUA_API void lua_settag (lua_State *L, int tag); + +LUA_API void lua_error (lua_State *L, const char *s); + +LUA_API void lua_unref (lua_State *L, int ref); + +LUA_API int lua_next (lua_State *L, int index); +LUA_API int lua_getn (lua_State *L, int index); + +LUA_API void lua_concat (lua_State *L, int n); + +LUA_API void *lua_newuserdata (lua_State *L, size_t size); + + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + +#define lua_pop(L,n) lua_settop(L, -(n)-1) + +#define lua_register(L,n,f) (lua_pushcfunction(L, f), lua_setglobal(L, n)) +#define lua_pushuserdata(L,u) lua_pushusertag(L, u, 0) +#define lua_pushcfunction(L,f) lua_pushcclosure(L, f, 0) +#define lua_clonetag(L,t) lua_copytagmethods(L, lua_newtag(L), (t)) + +#define lua_isfunction(L,n) (lua_type(L,n) == LUA_TFUNCTION) +#define lua_istable(L,n) (lua_type(L,n) == LUA_TTABLE) +#define lua_isuserdata(L,n) (lua_type(L,n) == LUA_TUSERDATA) +#define lua_isnil(L,n) (lua_type(L,n) == LUA_TNIL) +#define lua_isnull(L,n) (lua_type(L,n) == LUA_TNONE) + +#define lua_getregistry(L) lua_getref(L, LUA_REFREGISTRY) + +#endif + + + +/****************************************************************************** +* Copyright (C) 1994-2000 TeCGraf, PUC-Rio. All rights reserved. +* +* Permission is hereby granted, without written agreement and without license +* or royalty fees, to use, copy, modify, and distribute this software and its +* documentation for any purpose, including commercial applications, subject to +* the following conditions: +* +* - The above copyright notice and this permission notice shall appear in all +* copies or substantial portions of this software. +* +* - The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software in a +* product, an acknowledgment in the product documentation would be greatly +* appreciated (but it is not required). +* +* - Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* +* The authors specifically disclaim any warranties, including, but not limited +* to, the implied warranties of merchantability and fitness for a particular +* purpose. The software provided hereunder is on an "as is" basis, and the +* authors have no obligation to provide maintenance, support, updates, +* enhancements, or modifications. In no event shall TeCGraf, PUC-Rio, or the +* authors be held liable to any party for direct, indirect, special, +* incidental, or consequential damages arising out of the use of this software +* and its documentation. +* +* The Lua language and this implementation have been entirely designed and +* written by Waldemar Celes Filho, Roberto Ierusalimschy and +* Luiz Henrique de Figueiredo at TeCGraf, PUC-Rio. +* +* This implementation contains no third-party code. +******************************************************************************/ + diff --git a/build/premake/src/Src/Lua/luadebug.h b/build/premake/src/Src/Lua/luadebug.h new file mode 100644 index 0000000000..a244e72438 --- /dev/null +++ b/build/premake/src/Src/Lua/luadebug.h @@ -0,0 +1,46 @@ +/* +** $Id: luadebug.h,v 1.1 2003/01/24 16:26:17 jason379 Exp $ +** Debugging API +** See Copyright Notice in lua.h +*/ + + +#ifndef luadebug_h +#define luadebug_h + + +#include "lua.h" + +typedef struct lua_Debug lua_Debug; /* activation record */ +typedef struct lua_Localvar lua_Localvar; + +typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); + +LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func); +LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func); + + +#define LUA_IDSIZE 60 + +struct lua_Debug { + const char *event; /* `call', `return' */ + int currentline; /* (l) */ + const char *name; /* (n) */ + const char *namewhat; /* (n) `global', `tag method', `local', `field' */ + int nups; /* (u) number of upvalues */ + int linedefined; /* (S) */ + const char *what; /* (S) `Lua' function, `C' function, Lua `main' */ + const char *source; /* (S) */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + struct lua_TObject *_func; /* active function */ +}; + + +#endif diff --git a/build/premake/src/Src/Lua/lualib.h b/build/premake/src/Src/Lua/lualib.h new file mode 100644 index 0000000000..1bf2ca91fa --- /dev/null +++ b/build/premake/src/Src/Lua/lualib.h @@ -0,0 +1,34 @@ +/* +** $Id: lualib.h,v 1.1 2003/01/24 16:26:18 jason379 Exp $ +** Lua standard libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lualib_h +#define lualib_h + +#include "lua.h" + + +#ifndef LUALIB_API +#define LUALIB_API extern +#endif + + +#define LUA_ALERT "_ALERT" + +LUALIB_API void lua_baselibopen (lua_State *L); +LUALIB_API void lua_iolibopen (lua_State *L); +LUALIB_API void lua_strlibopen (lua_State *L); +LUALIB_API void lua_mathlibopen (lua_State *L); +LUALIB_API void lua_dblibopen (lua_State *L); + + + +/* Auxiliary functions (private) */ + +const char *luaI_classend (lua_State *L, const char *p); +int luaI_singlematch (int c, const char *p, const char *ep); + +#endif diff --git a/build/premake/src/Src/Lua/lundump.c b/build/premake/src/Src/Lua/lundump.c new file mode 100644 index 0000000000..39dc3d8d56 --- /dev/null +++ b/build/premake/src/Src/Lua/lundump.c @@ -0,0 +1,244 @@ +/* +** $Id: lundump.c,v 1.1 2003/01/24 16:26:18 jason379 Exp $ +** load bytecodes from files +** See Copyright Notice in lua.h +*/ + +#include +#include + +#include "lfunc.h" +#include "lmem.h" +#include "lopcodes.h" +#include "lstring.h" +#include "lundump.h" + +#define LoadByte ezgetc + +static const char* ZNAME (ZIO* Z) +{ + const char* s=zname(Z); + return (*s=='@') ? s+1 : s; +} + +static void unexpectedEOZ (lua_State* L, ZIO* Z) +{ + luaO_verror(L,"unexpected end of file in `%.99s'",ZNAME(Z)); +} + +static int ezgetc (lua_State* L, ZIO* Z) +{ + int c=zgetc(Z); + if (c==EOZ) unexpectedEOZ(L,Z); + return c; +} + +static void ezread (lua_State* L, ZIO* Z, void* b, int n) +{ + int r=zread(Z,b,n); + if (r!=0) unexpectedEOZ(L,Z); +} + +static void LoadBlock (lua_State* L, void* b, size_t size, ZIO* Z, int swap) +{ + if (swap) + { + char *p=(char *) b+size-1; + int n=size; + while (n--) *p--=(char)ezgetc(L,Z); + } + else + ezread(L,Z,b,size); +} + +static void LoadVector (lua_State* L, void* b, int m, size_t size, ZIO* Z, int swap) +{ + if (swap) + { + char *q=(char *) b; + while (m--) + { + char *p=q+size-1; + int n=size; + while (n--) *p--=(char)ezgetc(L,Z); + q+=size; + } + } + else + ezread(L,Z,b,m*size); +} + +static int LoadInt (lua_State* L, ZIO* Z, int swap) +{ + int x; + LoadBlock(L,&x,sizeof(x),Z,swap); + return x; +} + +static size_t LoadSize (lua_State* L, ZIO* Z, int swap) +{ + size_t x; + LoadBlock(L,&x,sizeof(x),Z,swap); + return x; +} + +static Number LoadNumber (lua_State* L, ZIO* Z, int swap) +{ + Number x; + LoadBlock(L,&x,sizeof(x),Z,swap); + return x; +} + +static TString* LoadString (lua_State* L, ZIO* Z, int swap) +{ + size_t size=LoadSize(L,Z,swap); + if (size==0) + return NULL; + else + { + char* s=luaO_openspace(L,size); + LoadBlock(L,s,size,Z,0); + return luaS_newlstr(L,s,size-1); /* remove trailing '\0' */ + } +} + +static void LoadCode (lua_State* L, Proto* tf, ZIO* Z, int swap) +{ + int size=LoadInt(L,Z,swap); + tf->code=luaM_newvector(L,size,Instruction); + LoadVector(L,tf->code,size,sizeof(*tf->code),Z,swap); + if (tf->code[size-1]!=OP_END) luaO_verror(L,"bad code in `%.99s'",ZNAME(Z)); + luaF_protook(L,tf,size); +} + +static void LoadLocals (lua_State* L, Proto* tf, ZIO* Z, int swap) +{ + int i,n; + tf->nlocvars=n=LoadInt(L,Z,swap); + tf->locvars=luaM_newvector(L,n,LocVar); + for (i=0; ilocvars[i].varname=LoadString(L,Z,swap); + tf->locvars[i].startpc=LoadInt(L,Z,swap); + tf->locvars[i].endpc=LoadInt(L,Z,swap); + } +} + +static void LoadLines (lua_State* L, Proto* tf, ZIO* Z, int swap) +{ + int n; + tf->nlineinfo=n=LoadInt(L,Z,swap); + tf->lineinfo=luaM_newvector(L,n,int); + LoadVector(L,tf->lineinfo,n,sizeof(*tf->lineinfo),Z,swap); +} + +static Proto* LoadFunction (lua_State* L, ZIO* Z, int swap); + +static void LoadConstants (lua_State* L, Proto* tf, ZIO* Z, int swap) +{ + int i,n; + tf->nkstr=n=LoadInt(L,Z,swap); + tf->kstr=luaM_newvector(L,n,TString*); + for (i=0; ikstr[i]=LoadString(L,Z,swap); + tf->nknum=n=LoadInt(L,Z,swap); + tf->knum=luaM_newvector(L,n,Number); + LoadVector(L,tf->knum,n,sizeof(*tf->knum),Z,swap); + tf->nkproto=n=LoadInt(L,Z,swap); + tf->kproto=luaM_newvector(L,n,Proto*); + for (i=0; ikproto[i]=LoadFunction(L,Z,swap); +} + +static Proto* LoadFunction (lua_State* L, ZIO* Z, int swap) +{ + Proto* tf=luaF_newproto(L); + tf->source=LoadString(L,Z,swap); + tf->lineDefined=LoadInt(L,Z,swap); + tf->numparams=LoadInt(L,Z,swap); + tf->is_vararg=LoadByte(L,Z); + tf->maxstacksize=LoadInt(L,Z,swap); + LoadLocals(L,tf,Z,swap); + LoadLines(L,tf,Z,swap); + LoadConstants(L,tf,Z,swap); + LoadCode(L,tf,Z,swap); + return tf; +} + +static void LoadSignature (lua_State* L, ZIO* Z) +{ + const char* s=SIGNATURE; + while (*s!=0 && ezgetc(L,Z)==*s) + ++s; + if (*s!=0) luaO_verror(L,"bad signature in `%.99s'",ZNAME(Z)); +} + +static void TestSize (lua_State* L, int s, const char* what, ZIO* Z) +{ + int r=ezgetc(L,Z); + if (r!=s) + luaO_verror(L,"virtual machine mismatch in `%.99s':\n" + " %.20s is %d but read %d",ZNAME(Z),what,s,r); +} + +#define TESTSIZE(s) TestSize(L,s,#s,Z) +#define V(v) v/16,v%16 + +static int LoadHeader (lua_State* L, ZIO* Z) +{ + int version,swap; + Number f=0,tf=TEST_NUMBER; + LoadSignature(L,Z); + version=ezgetc(L,Z); + if (version>VERSION) + luaO_verror(L,"`%.99s' too new:\n" + " read version %d.%d; expected at most %d.%d", + ZNAME(Z),V(version),V(VERSION)); + if (version" +#define SOURCE tf->lineDefined,tf->source->str +#define IN_FMT " in %p " SOURCE_FMT +#define IN tf,SOURCE + +/* a multiple of PI for testing native format */ +/* multiplying by 1E8 gives non-trivial integer values */ +#define TEST_NUMBER 3.14159265358979323846E8 + +#endif diff --git a/build/premake/src/Src/Lua/lvm.c b/build/premake/src/Src/Lua/lvm.c new file mode 100644 index 0000000000..2243d3e745 --- /dev/null +++ b/build/premake/src/Src/Lua/lvm.c @@ -0,0 +1,710 @@ +/* +** $Id: lvm.c,v 1.1 2003/01/24 16:26:18 jason379 Exp $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + +#ifdef OLD_ANSI +#define strcoll(a,b) strcmp(a,b) +#endif + + + +/* +** Extra stack size to run a function: +** TAG_LINE(1), NAME(1), TM calls(3) (plus some extra...) +*/ +#define EXTRA_STACK 8 + + + +int luaV_tonumber (TObject *obj) { + if (ttype(obj) != LUA_TSTRING) + return 1; + else { + if (!luaO_str2d(svalue(obj), &nvalue(obj))) + return 2; + ttype(obj) = LUA_TNUMBER; + return 0; + } +} + + +int luaV_tostring (lua_State *L, TObject *obj) { /* LUA_NUMBER */ + if (ttype(obj) != LUA_TNUMBER) + return 1; + else { + char s[32]; /* 16 digits, sign, point and \0 (+ some extra...) */ + lua_number2str(s, nvalue(obj)); /* convert `s' to number */ + tsvalue(obj) = luaS_new(L, s); + ttype(obj) = LUA_TSTRING; + return 0; + } +} + + +static void traceexec (lua_State *L, StkId base, StkId top, lua_Hook linehook) { + CallInfo *ci = infovalue(base-1); + int *lineinfo = ci->func->f.l->lineinfo; + int pc = (*ci->pc - ci->func->f.l->code) - 1; + int newline; + if (pc == 0) { /* may be first time? */ + ci->line = 1; + ci->refi = 0; + ci->lastpc = pc+1; /* make sure it will call linehook */ + } + newline = luaG_getline(lineinfo, pc, ci->line, &ci->refi); + /* calls linehook when enters a new line or jumps back (loop) */ + if (newline != ci->line || pc <= ci->lastpc) { + ci->line = newline; + L->top = top; + luaD_lineHook(L, base-1, newline, linehook); + } + ci->lastpc = pc; +} + + +static Closure *luaV_closure (lua_State *L, int nelems) { + Closure *c = luaF_newclosure(L, nelems); + L->top -= nelems; + while (nelems--) + c->upvalue[nelems] = *(L->top+nelems); + clvalue(L->top) = c; + ttype(L->top) = LUA_TFUNCTION; + incr_top; + return c; +} + + +void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems) { + Closure *cl = luaV_closure(L, nelems); + cl->f.c = c; + cl->isC = 1; +} + + +void luaV_Lclosure (lua_State *L, Proto *l, int nelems) { + Closure *cl = luaV_closure(L, nelems); + cl->f.l = l; + cl->isC = 0; +} + + +/* +** Function to index a table. +** Receives the table at `t' and the key at top. +*/ +const TObject *luaV_gettable (lua_State *L, StkId t) { + Closure *tm; + int tg; + if (ttype(t) == LUA_TTABLE && /* `t' is a table? */ + ((tg = hvalue(t)->htag) == LUA_TTABLE || /* with default tag? */ + luaT_gettm(L, tg, TM_GETTABLE) == NULL)) { /* or no TM? */ + /* do a primitive get */ + const TObject *h = luaH_get(L, hvalue(t), L->top-1); + /* result is no nil or there is no `index' tag method? */ + if (ttype(h) != LUA_TNIL || ((tm=luaT_gettm(L, tg, TM_INDEX)) == NULL)) + return h; /* return result */ + /* else call `index' tag method */ + } + else { /* try a `gettable' tag method */ + tm = luaT_gettmbyObj(L, t, TM_GETTABLE); + } + if (tm != NULL) { /* is there a tag method? */ + luaD_checkstack(L, 2); + *(L->top+1) = *(L->top-1); /* key */ + *L->top = *t; /* table */ + clvalue(L->top-1) = tm; /* tag method */ + ttype(L->top-1) = LUA_TFUNCTION; + L->top += 2; + luaD_call(L, L->top - 3, 1); + return L->top - 1; /* call result */ + } + else { /* no tag method */ + luaG_typeerror(L, t, "index"); + return NULL; /* to avoid warnings */ + } +} + + +/* +** Receives table at `t', key at `key' and value at top. +*/ +void luaV_settable (lua_State *L, StkId t, StkId key) { + int tg; + if (ttype(t) == LUA_TTABLE && /* `t' is a table? */ + ((tg = hvalue(t)->htag) == LUA_TTABLE || /* with default tag? */ + luaT_gettm(L, tg, TM_SETTABLE) == NULL)) /* or no TM? */ + *luaH_set(L, hvalue(t), key) = *(L->top-1); /* do a primitive set */ + else { /* try a `settable' tag method */ + Closure *tm = luaT_gettmbyObj(L, t, TM_SETTABLE); + if (tm != NULL) { + luaD_checkstack(L, 3); + *(L->top+2) = *(L->top-1); + *(L->top+1) = *key; + *(L->top) = *t; + clvalue(L->top-1) = tm; + ttype(L->top-1) = LUA_TFUNCTION; + L->top += 3; + luaD_call(L, L->top - 4, 0); /* call `settable' tag method */ + } + else /* no tag method... */ + luaG_typeerror(L, t, "index"); + } +} + + +const TObject *luaV_getglobal (lua_State *L, TString *s) { + const TObject *value = luaH_getstr(L->gt, s); + Closure *tm = luaT_gettmbyObj(L, value, TM_GETGLOBAL); + if (tm == NULL) /* is there a tag method? */ + return value; /* default behavior */ + else { /* tag method */ + luaD_checkstack(L, 3); + clvalue(L->top) = tm; + ttype(L->top) = LUA_TFUNCTION; + tsvalue(L->top+1) = s; /* global name */ + ttype(L->top+1) = LUA_TSTRING; + *(L->top+2) = *value; + L->top += 3; + luaD_call(L, L->top - 3, 1); + return L->top - 1; + } +} + + +void luaV_setglobal (lua_State *L, TString *s) { + const TObject *oldvalue = luaH_getstr(L->gt, s); + Closure *tm = luaT_gettmbyObj(L, oldvalue, TM_SETGLOBAL); + if (tm == NULL) { /* is there a tag method? */ + if (oldvalue != &luaO_nilobject) { + /* cast to remove `const' is OK, because `oldvalue' != luaO_nilobject */ + *(TObject *)oldvalue = *(L->top - 1); + } + else { + TObject key; + ttype(&key) = LUA_TSTRING; + tsvalue(&key) = s; + *luaH_set(L, L->gt, &key) = *(L->top - 1); + } + } + else { + luaD_checkstack(L, 3); + *(L->top+2) = *(L->top-1); /* new value */ + *(L->top+1) = *oldvalue; + ttype(L->top) = LUA_TSTRING; + tsvalue(L->top) = s; + clvalue(L->top-1) = tm; + ttype(L->top-1) = LUA_TFUNCTION; + L->top += 3; + luaD_call(L, L->top - 4, 0); + } +} + + +static int call_binTM (lua_State *L, StkId top, TMS event) { + /* try first operand */ + Closure *tm = luaT_gettmbyObj(L, top-2, event); + L->top = top; + if (tm == NULL) { + tm = luaT_gettmbyObj(L, top-1, event); /* try second operand */ + if (tm == NULL) { + tm = luaT_gettm(L, 0, event); /* try a `global' method */ + if (tm == NULL) + return 0; /* error */ + } + } + lua_pushstring(L, luaT_eventname[event]); + luaD_callTM(L, tm, 3, 1); + return 1; +} + + +static void call_arith (lua_State *L, StkId top, TMS event) { + if (!call_binTM(L, top, event)) + luaG_binerror(L, top-2, LUA_TNUMBER, "perform arithmetic on"); +} + + +static int luaV_strcomp (const TString *ls, const TString *rs) { + const char *l = ls->str; + size_t ll = ls->len; + const char *r = rs->str; + size_t lr = rs->len; + for (;;) { + int temp = strcoll(l, r); + if (temp != 0) return temp; + else { /* strings are equal up to a '\0' */ + size_t len = strlen(l); /* index of first '\0' in both strings */ + if (len == ll) /* l is finished? */ + return (len == lr) ? 0 : -1; /* l is equal or smaller than r */ + else if (len == lr) /* r is finished? */ + return 1; /* l is greater than r (because l is not finished) */ + /* both strings longer than `len'; go on comparing (after the '\0') */ + len++; + l += len; ll -= len; r += len; lr -= len; + } + } +} + + +int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top) { + if (ttype(l) == LUA_TNUMBER && ttype(r) == LUA_TNUMBER) + return (nvalue(l) < nvalue(r)); + else if (ttype(l) == LUA_TSTRING && ttype(r) == LUA_TSTRING) + return (luaV_strcomp(tsvalue(l), tsvalue(r)) < 0); + else { /* call TM */ + luaD_checkstack(L, 2); + *top++ = *l; + *top++ = *r; + if (!call_binTM(L, top, TM_LT)) + luaG_ordererror(L, top-2); + L->top--; + return (ttype(L->top) != LUA_TNIL); + } +} + + +void luaV_strconc (lua_State *L, int total, StkId top) { + do { + int n = 2; /* number of elements handled in this pass (at least 2) */ + if (tostring(L, top-2) || tostring(L, top-1)) { + if (!call_binTM(L, top, TM_CONCAT)) + luaG_binerror(L, top-2, LUA_TSTRING, "concat"); + } + else if (tsvalue(top-1)->len > 0) { /* if len=0, do nothing */ + /* at least two string values; get as many as possible */ + lint32 tl = (lint32)tsvalue(top-1)->len + + (lint32)tsvalue(top-2)->len; + char *buffer; + int i; + while (n < total && !tostring(L, top-n-1)) { /* collect total length */ + tl += tsvalue(top-n-1)->len; + n++; + } + if (tl > MAX_SIZET) lua_error(L, "string size overflow"); + buffer = luaO_openspace(L, tl); + tl = 0; + for (i=n; i>0; i--) { /* concat all strings */ + size_t l = tsvalue(top-i)->len; + memcpy(buffer+tl, tsvalue(top-i)->str, l); + tl += l; + } + tsvalue(top-n) = luaS_newlstr(L, buffer, tl); + } + total -= n-1; /* got `n' strings to create 1 new */ + top -= n-1; + } while (total > 1); /* repeat until only 1 result left */ +} + + +static void luaV_pack (lua_State *L, StkId firstelem) { + int i; + Hash *htab = luaH_new(L, 0); + for (i=0; firstelem+itop; i++) + *luaH_setint(L, htab, i+1) = *(firstelem+i); + /* store counter in field `n' */ + luaH_setstrnum(L, htab, luaS_new(L, "n"), i); + L->top = firstelem; /* remove elements from the stack */ + ttype(L->top) = LUA_TTABLE; + hvalue(L->top) = htab; + incr_top; +} + + +static void adjust_varargs (lua_State *L, StkId base, int nfixargs) { + int nvararg = (L->top-base) - nfixargs; + if (nvararg < 0) + luaD_adjusttop(L, base, nfixargs); + luaV_pack(L, base+nfixargs); +} + + + +#define dojump(pc, i) { int d = GETARG_S(i); pc += d; } + +/* +** Executes the given Lua function. Parameters are between [base,top). +** Returns n such that the the results are between [n,top). +*/ +StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { + const Proto *const tf = cl->f.l; + StkId top; /* keep top local, for performance */ + const Instruction *pc = tf->code; + TString **const kstr = tf->kstr; + const lua_Hook linehook = L->linehook; + infovalue(base-1)->pc = &pc; + luaD_checkstack(L, tf->maxstacksize+EXTRA_STACK); + if (tf->is_vararg) /* varargs? */ + adjust_varargs(L, base, tf->numparams); + else + luaD_adjusttop(L, base, tf->numparams); + top = L->top; + /* main loop of interpreter */ + for (;;) { + const Instruction i = *pc++; + if (linehook) + traceexec(L, base, top, linehook); + switch (GET_OPCODE(i)) { + case OP_END: { + L->top = top; + return top; + } + case OP_RETURN: { + L->top = top; + return base+GETARG_U(i); + } + case OP_CALL: { + int nres = GETARG_B(i); + if (nres == MULT_RET) nres = LUA_MULTRET; + L->top = top; + luaD_call(L, base+GETARG_A(i), nres); + top = L->top; + break; + } + case OP_TAILCALL: { + L->top = top; + luaD_call(L, base+GETARG_A(i), LUA_MULTRET); + return base+GETARG_B(i); + } + case OP_PUSHNIL: { + int n = GETARG_U(i); + LUA_ASSERT(n>0, "invalid argument"); + do { + ttype(top++) = LUA_TNIL; + } while (--n > 0); + break; + } + case OP_POP: { + top -= GETARG_U(i); + break; + } + case OP_PUSHINT: { + ttype(top) = LUA_TNUMBER; + nvalue(top) = (Number)GETARG_S(i); + top++; + break; + } + case OP_PUSHSTRING: { + ttype(top) = LUA_TSTRING; + tsvalue(top) = kstr[GETARG_U(i)]; + top++; + break; + } + case OP_PUSHNUM: { + ttype(top) = LUA_TNUMBER; + nvalue(top) = tf->knum[GETARG_U(i)]; + top++; + break; + } + case OP_PUSHNEGNUM: { + ttype(top) = LUA_TNUMBER; + nvalue(top) = -tf->knum[GETARG_U(i)]; + top++; + break; + } + case OP_PUSHUPVALUE: { + *top++ = cl->upvalue[GETARG_U(i)]; + break; + } + case OP_GETLOCAL: { + *top++ = *(base+GETARG_U(i)); + break; + } + case OP_GETGLOBAL: { + L->top = top; + *top = *luaV_getglobal(L, kstr[GETARG_U(i)]); + top++; + break; + } + case OP_GETTABLE: { + L->top = top; + top--; + *(top-1) = *luaV_gettable(L, top-1); + break; + } + case OP_GETDOTTED: { + ttype(top) = LUA_TSTRING; + tsvalue(top) = kstr[GETARG_U(i)]; + L->top = top+1; + *(top-1) = *luaV_gettable(L, top-1); + break; + } + case OP_GETINDEXED: { + *top = *(base+GETARG_U(i)); + L->top = top+1; + *(top-1) = *luaV_gettable(L, top-1); + break; + } + case OP_PUSHSELF: { + TObject receiver; + receiver = *(top-1); + ttype(top) = LUA_TSTRING; + tsvalue(top++) = kstr[GETARG_U(i)]; + L->top = top; + *(top-2) = *luaV_gettable(L, top-2); + *(top-1) = receiver; + break; + } + case OP_CREATETABLE: { + L->top = top; + luaC_checkGC(L); + hvalue(top) = luaH_new(L, GETARG_U(i)); + ttype(top) = LUA_TTABLE; + top++; + break; + } + case OP_SETLOCAL: { + *(base+GETARG_U(i)) = *(--top); + break; + } + case OP_SETGLOBAL: { + L->top = top; + luaV_setglobal(L, kstr[GETARG_U(i)]); + top--; + break; + } + case OP_SETTABLE: { + StkId t = top-GETARG_A(i); + L->top = top; + luaV_settable(L, t, t+1); + top -= GETARG_B(i); /* pop values */ + break; + } + case OP_SETLIST: { + int aux = GETARG_A(i) * LFIELDS_PER_FLUSH; + int n = GETARG_B(i); + Hash *arr = hvalue(top-n-1); + L->top = top-n; /* final value of `top' (in case of errors) */ + for (; n; n--) + *luaH_setint(L, arr, n+aux) = *(--top); + break; + } + case OP_SETMAP: { + int n = GETARG_U(i); + StkId finaltop = top-2*n; + Hash *arr = hvalue(finaltop-1); + L->top = finaltop; /* final value of `top' (in case of errors) */ + for (; n; n--) { + top-=2; + *luaH_set(L, arr, top) = *(top+1); + } + break; + } + case OP_ADD: { + if (tonumber(top-2) || tonumber(top-1)) + call_arith(L, top, TM_ADD); + else + nvalue(top-2) += nvalue(top-1); + top--; + break; + } + case OP_ADDI: { + if (tonumber(top-1)) { + ttype(top) = LUA_TNUMBER; + nvalue(top) = (Number)GETARG_S(i); + call_arith(L, top+1, TM_ADD); + } + else + nvalue(top-1) += (Number)GETARG_S(i); + break; + } + case OP_SUB: { + if (tonumber(top-2) || tonumber(top-1)) + call_arith(L, top, TM_SUB); + else + nvalue(top-2) -= nvalue(top-1); + top--; + break; + } + case OP_MULT: { + if (tonumber(top-2) || tonumber(top-1)) + call_arith(L, top, TM_MUL); + else + nvalue(top-2) *= nvalue(top-1); + top--; + break; + } + case OP_DIV: { + if (tonumber(top-2) || tonumber(top-1)) + call_arith(L, top, TM_DIV); + else + nvalue(top-2) /= nvalue(top-1); + top--; + break; + } + case OP_POW: { + if (!call_binTM(L, top, TM_POW)) + lua_error(L, "undefined operation"); + top--; + break; + } + case OP_CONCAT: { + int n = GETARG_U(i); + luaV_strconc(L, n, top); + top -= n-1; + L->top = top; + luaC_checkGC(L); + break; + } + case OP_MINUS: { + if (tonumber(top-1)) { + ttype(top) = LUA_TNIL; + call_arith(L, top+1, TM_UNM); + } + else + nvalue(top-1) = -nvalue(top-1); + break; + } + case OP_NOT: { + ttype(top-1) = + (ttype(top-1) == LUA_TNIL) ? LUA_TNUMBER : LUA_TNIL; + nvalue(top-1) = 1; + break; + } + case OP_JMPNE: { + top -= 2; + if (!luaO_equalObj(top, top+1)) dojump(pc, i); + break; + } + case OP_JMPEQ: { + top -= 2; + if (luaO_equalObj(top, top+1)) dojump(pc, i); + break; + } + case OP_JMPLT: { + top -= 2; + if (luaV_lessthan(L, top, top+1, top+2)) dojump(pc, i); + break; + } + case OP_JMPLE: { /* a <= b === !(b b === (b= b === !(a 0 ? + nvalue(top-3) > nvalue(top-2) : + nvalue(top-3) < nvalue(top-2)) { /* `empty' loop? */ + top -= 3; /* remove control variables */ + dojump(pc, i); /* jump to loop end */ + } + break; + } + case OP_FORLOOP: { + LUA_ASSERT(ttype(top-1) == LUA_TNUMBER, "invalid step"); + LUA_ASSERT(ttype(top-2) == LUA_TNUMBER, "invalid limit"); + if (ttype(top-3) != LUA_TNUMBER) + lua_error(L, "`for' index must be a number"); + nvalue(top-3) += nvalue(top-1); /* increment index */ + if (nvalue(top-1) > 0 ? + nvalue(top-3) > nvalue(top-2) : + nvalue(top-3) < nvalue(top-2)) + top -= 3; /* end loop: remove control variables */ + else + dojump(pc, i); /* repeat loop */ + break; + } + case OP_LFORPREP: { + Node *node; + if (ttype(top-1) != LUA_TTABLE) + lua_error(L, "`for' table must be a table"); + node = luaH_next(L, hvalue(top-1), &luaO_nilobject); + if (node == NULL) { /* `empty' loop? */ + top--; /* remove table */ + dojump(pc, i); /* jump to loop end */ + } + else { + top += 2; /* index,value */ + *(top-2) = *key(node); + *(top-1) = *val(node); + } + break; + } + case OP_LFORLOOP: { + Node *node; + LUA_ASSERT(ttype(top-3) == LUA_TTABLE, "invalid table"); + node = luaH_next(L, hvalue(top-3), top-2); + if (node == NULL) /* end loop? */ + top -= 3; /* remove table, key, and value */ + else { + *(top-2) = *key(node); + *(top-1) = *val(node); + dojump(pc, i); /* repeat loop */ + } + break; + } + case OP_CLOSURE: { + L->top = top; + luaV_Lclosure(L, tf->kproto[GETARG_A(i)], GETARG_B(i)); + top = L->top; + luaC_checkGC(L); + break; + } + } + } +} diff --git a/build/premake/src/Src/Lua/lvm.h b/build/premake/src/Src/Lua/lvm.h new file mode 100644 index 0000000000..4425fcce12 --- /dev/null +++ b/build/premake/src/Src/Lua/lvm.h @@ -0,0 +1,32 @@ +/* +** $Id: lvm.h,v 1.1 2003/01/24 16:26:18 jason379 Exp $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lvm_h +#define lvm_h + + +#include "ldo.h" +#include "lobject.h" +#include "ltm.h" + + +#define tonumber(o) ((ttype(o) != LUA_TNUMBER) && (luaV_tonumber(o) != 0)) +#define tostring(L,o) ((ttype(o) != LUA_TSTRING) && (luaV_tostring(L, o) != 0)) + + +int luaV_tonumber (TObject *obj); +int luaV_tostring (lua_State *L, TObject *obj); +const TObject *luaV_gettable (lua_State *L, StkId t); +void luaV_settable (lua_State *L, StkId t, StkId key); +const TObject *luaV_getglobal (lua_State *L, TString *s); +void luaV_setglobal (lua_State *L, TString *s); +StkId luaV_execute (lua_State *L, const Closure *cl, StkId base); +void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems); +void luaV_Lclosure (lua_State *L, Proto *l, int nelems); +int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top); +void luaV_strconc (lua_State *L, int total, StkId top); + +#endif diff --git a/build/premake/src/Src/Lua/lzio.c b/build/premake/src/Src/Lua/lzio.c new file mode 100644 index 0000000000..e21f354516 --- /dev/null +++ b/build/premake/src/Src/Lua/lzio.c @@ -0,0 +1,84 @@ +/* +** $Id: lzio.c,v 1.1 2003/01/24 16:26:18 jason379 Exp $ +** a generic input stream interface +** See Copyright Notice in lua.h +*/ + + + +#include +#include + +#include "lua.h" + +#include "lzio.h" + + + +/* ----------------------------------------------------- memory buffers --- */ + +static int zmfilbuf (ZIO* z) { + (void)z; /* to avoid warnings */ + return EOZ; +} + + +ZIO* zmopen (ZIO* z, const char* b, size_t size, const char *name) { + if (b==NULL) return NULL; + z->n = size; + z->p = (const unsigned char *)b; + z->filbuf = zmfilbuf; + z->u = NULL; + z->name = name; + return z; +} + +/* ------------------------------------------------------------ strings --- */ + +ZIO* zsopen (ZIO* z, const char* s, const char *name) { + if (s==NULL) return NULL; + return zmopen(z, s, strlen(s), name); +} + +/* -------------------------------------------------------------- FILEs --- */ + +static int zffilbuf (ZIO* z) { + size_t n; + if (feof((FILE *)z->u)) return EOZ; + n = fread(z->buffer, 1, ZBSIZE, (FILE *)z->u); + if (n==0) return EOZ; + z->n = n-1; + z->p = z->buffer; + return *(z->p++); +} + + +ZIO* zFopen (ZIO* z, FILE* f, const char *name) { + if (f==NULL) return NULL; + z->n = 0; + z->p = z->buffer; + z->filbuf = zffilbuf; + z->u = f; + z->name = name; + return z; +} + + +/* --------------------------------------------------------------- read --- */ +size_t zread (ZIO *z, void *b, size_t n) { + while (n) { + size_t m; + if (z->n == 0) { + if (z->filbuf(z) == EOZ) + return n; /* return number of missing bytes */ + zungetc(z); /* put result from `filbuf' in the buffer */ + } + m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ + memcpy(b, z->p, m); + z->n -= m; + z->p += m; + b = (char *)b + m; + n -= m; + } + return 0; +} diff --git a/build/premake/src/Src/Lua/lzio.h b/build/premake/src/Src/Lua/lzio.h new file mode 100644 index 0000000000..5c318873b8 --- /dev/null +++ b/build/premake/src/Src/Lua/lzio.h @@ -0,0 +1,53 @@ +/* +** $Id: lzio.h,v 1.1 2003/01/24 16:26:18 jason379 Exp $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + + +#ifndef lzio_h +#define lzio_h + +#include + + + +/* For Lua only */ +#define zFopen luaZ_Fopen +#define zsopen luaZ_sopen +#define zmopen luaZ_mopen +#define zread luaZ_read + +#define EOZ (-1) /* end of stream */ + +typedef struct zio ZIO; + +ZIO* zFopen (ZIO* z, FILE* f, const char *name); /* open FILEs */ +ZIO* zsopen (ZIO* z, const char* s, const char *name); /* string */ +ZIO* zmopen (ZIO* z, const char* b, size_t size, const char *name); /* memory */ + +size_t zread (ZIO* z, void* b, size_t n); /* read next n bytes */ + +#define zgetc(z) (((z)->n--)>0 ? ((int)*(z)->p++): (z)->filbuf(z)) +#define zungetc(z) (++(z)->n,--(z)->p) +#define zname(z) ((z)->name) + + + +/* --------- Private Part ------------------ */ + +#ifndef ZBSIZE +#define ZBSIZE 256 /* buffer size */ +#endif + +struct zio { + size_t n; /* bytes still unread */ + const unsigned char* p; /* current position in buffer */ + int (*filbuf)(ZIO* z); + void* u; /* additional data */ + const char *name; + unsigned char buffer[ZBSIZE]; /* buffer */ +}; + + +#endif diff --git a/build/premake/src/Src/clean.c b/build/premake/src/Src/clean.c new file mode 100644 index 0000000000..dec4bb71ef --- /dev/null +++ b/build/premake/src/Src/clean.c @@ -0,0 +1,74 @@ +//----------------------------------------------------------------------------- +// Premake - clean.c +// +// Remove all project and intermediate files. +// +// Copyright (C) 2002-2003 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: clean.c,v 1.6 2004/03/27 13:42:24 jason379 Exp $ +//----------------------------------------------------------------------------- + +#include +#include +#include "project.h" +#include "util.h" + +//----------------------------------------------------------------------------- + +int makeClean() +{ + int i, j; + const char* binaries = project->binaries; + const char* libraries = project->libraries; + + puts("Removing all project and intermediate files..."); + + deleteFile(project->path, project->name, ".sln"); // VS200x + deleteFile(project->path, project->name, ".suo"); // VS200x + deleteFile(project->path, project->name, ".ncb"); // VS6/200x + deleteFile(project->path, project->name, ".dsw"); // VS6 + deleteFile(project->path, project->name, ".opt"); // VS6 + deleteFile(project->path, "Makefile", ""); // GNU + deleteFile(project->path, project->name, ".cmbx"); // SharpDevelop + + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + const char* name = package->name; + const char* path = package->path; + + for (j = 0; j < package->numConfigs; ++j) + { + char buffer[256]; + Config* config = package->config[j]; + const char* target = config->target; + + strcpy(buffer, "lib"); // posix shared lib + strcat(buffer, target); + deleteFile(binaries, buffer, ".so"); + + deleteFile(binaries, target, ""); // posix executable + deleteFile(binaries, target, ".exe"); // windows executable + deleteFile(binaries, target, ".dll"); // windows or .NET shared lib + deleteFile(binaries, target, ".pdb"); // VS symbol file + deleteFile(binaries, target, ".ilk"); // VS incremental link + deleteFile(libraries, target, ".pdb"); // VS symbol file + deleteFile(libraries, target, ".exp"); // VS export lib + deleteFile(libraries, target, ".lib"); // windows static lib + } + + deleteFile(path, name, ".csproj"); // VS200x + deleteFile(path, name, ".csproj.user"); // VS200x + deleteFile(path, name, ".csproj.webinfo"); // VS200x + deleteFile(path, name, ".vcproj"); // VS200x + deleteFile(path, name, ".dsp"); // VS6 + deleteFile(path, name, ".plg"); // VS6 + deleteFile(path, name, ".make"); // GNU + deleteFile(path, name, ".prjx"); // SharpDevelop + + deleteDirectory(path, "obj"); // intermediates directory + } + + return 1; +} diff --git a/build/premake/src/Src/gnu.c b/build/premake/src/Src/gnu.c new file mode 100644 index 0000000000..0147db3888 --- /dev/null +++ b/build/premake/src/Src/gnu.c @@ -0,0 +1,568 @@ +//----------------------------------------------------------------------------- +// Premake - gnu.c +// +// GNU tool target. +// +// Copyright (C) 2002-2004 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: gnu.c,v 1.26 2004/05/05 23:23:44 jason379 Exp $ +//----------------------------------------------------------------------------- + +#include +#include +#include "project.h" +#include "util.h" + +#define MAKEFILE_EXT ".make" +#define OBJECTS_DIR "obj" +#define OBJECTS_EXT ".o" + +extern const char** commandLineArgs; +extern const char* rootProjectFile; +extern const char* cc; +extern const char* dotnet; +extern int verbose; + +static int writeRootMakefile(); +static int writeCppPackage(Package* package); +static int writeCsPackage(Package* package); + +//----------------------------------------------------------------------------- + +int makeGnuScripts() +{ + int i; + + puts("Generating GNU makefiles:"); + + if (!writeRootMakefile()) + return 0; + + for (i = 0; i < project->numPackages; ++i) + { + int result; + Package* package = project->package[i]; + const char* language = package->language; + + printf("...%s\n", package->name); + + if (strcmp(language, "c#") == 0) + result = writeCsPackage(package); + else if (strcmp(language, "c++") == 0 || strcmp(language, "c") == 0) + result = writeCppPackage(package); + else + { + printf("** Error: unrecognized language '%s'\n", language); + return 0; + } + + if (!result) return 0; + } + + return 1; +} + +//----------------------------------------------------------------------------- + +static const char* checkDeps(const char* ref, void* data) +{ + int i; + for (i = 0; i < project->numPackages; ++i) + { + if (strcmp(project->package[i]->name, ref) == 0) + return project->package[i]->name; + } + return NULL; +} + +static int writeRootMakefile() +{ + int i; + FILE* file; + + file = openFile(project->path, "Makefile", ""); + if (file == NULL) + { + puts("Error: unable to open Makefile\n"); + return 0; + } + + // Print the header, showing the possible build configurations + + fprintf(file, "# Makefile autogenerated by premake\n"); + fprintf(file, "# Options:\n"); + fprintf(file, "# CONFIG=["); + for (i = 0; i < project->package[0]->numConfigs; ++i) + { + if (i > 0) fprintf(file, "|"); + fprintf(file, project->package[0]->config[i]->name); + } + + fprintf(file, "]\n\n"); + + // Set a default build config if none specified + + fprintf(file, "ifndef CONFIG\n"); + fprintf(file, " CONFIG=%s\n", project->package[0]->config[0]->name); + fprintf(file, "endif\n\n"); + fprintf(file, "export CONFIG\n\n"); + + // List all of the available make targets + + fprintf(file, ".PHONY: all clean"); + for (i = 0; i < project->numPackages; ++i) + fprintf(file, " %s", project->package[i]->name); + fprintf(file, "\n\n"); + + // Make rules + + fprintf(file, "all:"); + for (i = 0; i < project->numPackages; ++i) + fprintf(file, " %s", project->package[i]->name); + fprintf(file, "\n\n"); + + // Target to regenerate the makefiles when the premake scripts change + + fprintf(file, "Makefile: %s%s", reversePath(project->path, ".", UNIX), rootProjectFile); + for (i = 0; i < project->numPackages; ++i) + { + if (project->package[i]->script != NULL) + fprintf(file, " %s%s", reversePath(project->path, ".", UNIX), project->package[i]->script); + } + fprintf(file, "\n"); + fprintf(file, "\t@echo ==== Regenerating Makefiles ====\n"); + fprintf(file, "\t@premake"); + for (i = 1; args[i] != NULL; ++i) + fprintf(file, " %s", args[i]); + fprintf(file, "\n\n"); + + // Individual package targets + + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + + fprintf(file, "%s:", package->name); + writeList(file, package->config[0]->links, " ", "", "", checkDeps, NULL); + fprintf(file, "\n"); + + fprintf(file, "\t@echo ==== Building %s ====\n", package->name); + fprintf(file, "\t@$(MAKE) "); + fprintf(file, "--no-print-directory -C %s ", reversePath(project->path, package->path, UNIX)); + fprintf(file, "-f %s%s\n", package->name, MAKEFILE_EXT); + fprintf(file, "\n"); + } + + fprintf(file, "clean:\n"); + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + + fprintf(file, "\t@$(MAKE) "); + fprintf(file, "--no-print-directory -C %s ", reversePath(project->path, package->path, UNIX)); + fprintf(file, "-f %s%s clean\n", package->name, MAKEFILE_EXT); + } + + fclose(file); + return 1; +} + +//----------------------------------------------------------------------------- + +static const char* checkCppSources(const char* file, void* data) +{ + if (isCppFile(file)) + return replaceExtension(getFilename(file,0), OBJECTS_EXT); + return NULL; +} + +static const char* checkCppFlags(const char* flag, void* data) +{ + char* cc = (char*)data; + + if (strcmp(flag, "with-symbols") == 0) + return "-g"; + else if (strcmp(flag, "optimize-size") == 0) + return "-Os"; + else if (strcmp(flag, "optimize-speed") == 0) + return "-O3"; + else if (strcmp(flag, "no-rtti") == 0 && strcmp(cc, "C++") == 0) + return "--no-rtti"; + else if (strcmp(flag, "no-exceptions") == 0 && strcmp(cc, "C++") == 0) + return "--no-exceptions"; + else + return NULL; +} + +static void writeSourcePaths(FILE* file, const char* path, int stage) +{ + if (stage == WST_OPENGROUP && strlen(path) > 0) + fprintf(file, " %s", path); +} + +static const char* checkLink(const char* path, void* data) +{ + Package* package = getPackage(path); + if (package == NULL) return path; + + if (strcmp(package->language, "c++") == 0 || strcmp(package->language, "c") == 0) + return package->config[*((int*)data)]->target; + + return NULL; +} + +static int writeCppPackage(Package* package) +{ + const char* prefix = (verbose) ? "" : "@"; + + char buffer[4096]; + const char* cflags; + const char* ldflags; + FILE* file; + int i; + + const char* name = package->name; + const char* path = package->path; + const char* kind = package->kind; + + const char* location; + + // Set up the flags specific to the type of binary being built + + cflags = ""; + ldflags = ""; + location = "$(BINDIR)"; + + if (strcmp(kind, "exe") == 0 || strcmp(kind, "winexe") == 0) + { + /* defaults are fine */ + } + else if (strcmp(kind, "dll") == 0) + { + if (strcmp(osIdent, "windows") != 0) + cflags = " -fPIC"; + if (cc == NULL || strcmp(cc, "gcc") == 0) + ldflags = " -shared"; + } + else if (strcmp(kind, "lib") == 0) + { + location = "$(LIBDIR)"; + } + else + { + printf("** Error: unknown package type '%s'\n", kind); + return 0; + } + + // Open package makefile and write the header + + file = openFile(path, name, MAKEFILE_EXT); + if (file == NULL) return 0; + + fprintf(file, "# Sub-makefile autogenerated by premake\n\n"); + + // Build bin and lib paths, trim off trailing slash + strcpy(buffer, reversePath(path, project->binaries, UNIX)); + buffer[strlen(buffer)-1] = '\0'; + fprintf(file, "BINDIR = %s\n", buffer); + + strcpy(buffer, reversePath(path, project->libraries, UNIX)); + buffer[strlen(buffer)-1] = '\0'; + fprintf(file, "LIBDIR = %s\n\n", buffer); + + fprintf(file, "CFLAGS =%s\n", cflags); + fprintf(file, "LDFLAGS = -L$(BINDIR) -L$(LIBDIR)%s\n", ldflags); + fprintf(file, "TARGET =\n"); + if (strcmp(osIdent, "macosx") == 0 && strcmp(kind, "winexe") == 0) + fprintf(file, "MACAPP = \n"); + fprintf(file, "\n"); + + // Process the build configurations + + for (i = 0; i < package->numConfigs; ++i) + { + Config* config = package->config[i]; + fprintf(file, "ifeq ($(CONFIG),%s)\n", config->name); + + fprintf(file, " CFLAGS +="); + writeList(file, config->buildOptions, " ", "", "", NULL, "C"); + writeList(file, config->buildFlags, " ", "", "", checkCppFlags, "C"); + + if (strcmp(osIdent, "windows") == 0) + fprintf(file, " -D_WIN32"); + writeList(file, config->defines, " -D \"", "\"", "", NULL, NULL); + writeList(file, config->includePaths, " -I ", "", "", NULL, NULL); + fprintf(file, "\n"); + + fprintf(file, " CXXFLAGS = $(CFLAGS)"); + writeList(file, config->buildOptions, " ", "", "", NULL, "C++"); + writeList(file, config->buildFlags, " ", "", "", checkCppFlags, "C++"); + fprintf(file, "\n"); + + fprintf(file, " LDFLAGS +="); + writeList(file, config->linkOptions, " ", "", "", NULL, NULL); + writeList(file, config->linkFlags, " ", "", "", NULL, NULL); + writeList(file, config->libPaths, " -L ", "", "", NULL, NULL); + writeList(file, config->links, " -l", "", "", checkLink, &i); + fprintf(file, "\n"); + + fprintf(file, " TARGET = "); + if (strcmp(kind, "winexe") == 0 || strcmp(kind, "exe") == 0) + { + if (strcmp(kind, "winexe") == 0 && strcmp(osIdent, "macosx") == 0) + { + fprintf(file, "%s.app/Contents/MacOS/%s\n", config->target, config->target); + fprintf(file, " MACAPP = %s\n", config->target); + } + else + { + fprintf(file, "%s\n", config->target); + } + } + else + { + fprintf(file, "%s/", getDirectory(config->target)); + if (strcmp(kind, "lib") == 0) + { + fprintf(file, "lib%s.a\n", getFilename(config->target, 0)); + } + else + { + if (strcmp(osIdent, "windows") == 0) + fprintf(file, "%s.dll\n", getFilename(config->target, 0)); + else + fprintf(file, "lib%s.so\n", getFilename(config->target, 0)); + } + } + + fprintf(file, "endif\n"); + } + + fprintf(file, "\n"); + + // These rules auto-create dependency lists (see "Advanced Auto-Dependency + // Generation at http://www.paulandlesley.org/gmake/autodep.html) and place + // the *.P and *.o files in $(OBJ_DIR) + + // Note all of these targets do the same thing. Is there a way to reuse the + // command block? Didn't see anything in the make manual, though it would + // seem this is something people would want to do. + + for (i = 0; CPP_EXT[i]; ++i) + { + fprintf(file, "%s/%%.o : %%%s\n", OBJECTS_DIR, CPP_EXT[i]); + fprintf(file, "\t-%sif [ ! -d %s ]; then mkdir %s; fi\n", prefix, OBJECTS_DIR, OBJECTS_DIR); + if (!verbose) + fprintf(file, "\t@echo $(notdir $<)\n"); + + if (cc != NULL && strcmp(cc, "dmc") == 0) + { + if (strcmp(CPP_EXT[i], ".c") == 0) + fprintf(file, "\t%sdmc $(CFLAGS) -o $@ -c $<\n", prefix); + else + fprintf(file, "\t%sdmc -cpp -Ae -Ar -mn -D_WINDOWS $(CXXFLAGS) -o $@ -c $<\n", prefix); + } + else + { + if (strcmp(CPP_EXT[i], ".c") == 0) + fprintf(file, "\t%s$(CC) $(CFLAGS) -MD -o $@ -c $<\n", prefix); + else + fprintf(file, "\t%s$(CXX) $(CXXFLAGS) -MD -o $@ -c $<\n", prefix); + } + + fprintf(file, "\t-%sif [ -f $*.d ]; then mv $*.d obj/$*.d; fi\n", prefix); + fprintf(file, "\t%scp %s/$*.d %s/$*.P; \\\n", prefix, OBJECTS_DIR, OBJECTS_DIR); + fprintf(file, "\t sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\\\$$//' \\\n"); + fprintf(file, "\t -e '/^$$/ d' -e 's/$$/ :/' < %s/$*.d >> %s/$*.P; \\\n", OBJECTS_DIR, OBJECTS_DIR); + fprintf(file, "\trm -f %s/$*.d\n\n", OBJECTS_DIR); + } + + // Write out the list of object file targets for all C/C++ sources + + fprintf(file, "OBJECTS = \\\n"); + writeList(file, package->files, "\tobj/", " \\\n", "", checkCppSources, NULL); + fprintf(file, "\n"); + + // Write out the list of source directories + + fprintf(file, "VPATH ="); + walkSourceList(file, package, "", writeSourcePaths); + fprintf(file, "\n\n"); + + fprintf(file, ".PHONY: clean\n"); + fprintf(file, "\n"); + + if (strcmp(osIdent, "macosx") == 0 && strcmp(kind, "winexe") == 0) + { + fprintf(file, "all: $(BINDIR)/$(MACAPP).app/Contents/PkgInfo $(BINDIR)/$(MACAPP).app/Contents/Info.plist $(BINDIR)/$(TARGET)\n\n"); + } + + fprintf(file, "%s/$(TARGET): $(OBJECTS)\n", location); + fprintf(file, "\t@echo Linking %s\n", package->name); + fprintf(file, "\t-%sif [ ! -d $(BINDIR) ]; then mkdir -p $(BINDIR); fi\n", prefix); + fprintf(file, "\t-%sif [ ! -d $(LIBDIR) ]; then mkdir -p $(LIBDIR); fi\n", prefix); + if (strcmp(osIdent, "macosx") == 0 && strcmp(kind, "winexe") == 0) + fprintf(file, "\t-%sif [ ! -d $(BINDIR)/$(MACAPP).app/Contents/MacOS ]; then mkdir -p $(BINDIR)/$(MACAPP).app/Contents/MacOS; fi\n", prefix); + + if (strcmp(kind, "lib") == 0) + { + fprintf(file, "\t%sar -cr $@ $^\n", prefix); + fprintf(file, "\t%sranlib $@\n", prefix); + } + else + { + fprintf(file, "\t%s$(CXX) -o $@ $(filter-out %%.so, $^) $(LDFLAGS)\n", prefix); + } + fprintf(file, "\n"); + + if (strcmp(osIdent, "macosx") == 0 && strcmp(kind, "winexe") == 0) + { + fprintf(file, "$(BINDIR)/$(MACAPP).app/Contents/PkgInfo:\n"); + fprintf(file, "\n"); + + fprintf(file, "$(BINDIR)/$(MACAPP).app/Contents/Info.plist:\n"); + fprintf(file, "\n"); + } + + fprintf(file, "clean:\n"); + fprintf(file, "\t@echo Cleaning %s\n", package->name); + if (strcmp(osIdent, "macosx") == 0 && strcmp(kind, "winexe") == 0) + { + fprintf(file, "\t-%srm -rf %s/$(MACAPP).app %s/*\n", prefix, location, OBJECTS_DIR); + } + else + { + fprintf(file, "\t-%srm -rf %s/$(TARGET) %s/*\n", prefix, location, OBJECTS_DIR); + } + fprintf(file, "\n"); + + fprintf(file, "-include $(OBJECTS:%%.o=%%.P)\n\n"); + + fclose(file); + return 1; +} + +//----------------------------------------------------------------------------- + +static const char* checkReferences(const char* file, void* data) +{ + Package* package = getPackage(file); + if (package == NULL) return file; + if (strcmp(package->language, "c#") != 0) return NULL; + return package->config[*((int*)data)]->target; +} + +static const char* checkCsSources(const char* file, void* data) +{ + if (strcmp(getExtension(file), ".cs") == 0) + return file; + return NULL; +} + +static int writeCsPackage(Package* package) +{ + const char* extension; + const char* csc; + FILE* file; + int i; + + // Figure out what I'm building + + const char* name = package->name; + const char* path = package->path; + const char* kind = package->kind; + + if (strcmp(kind, "dll") == 0 || strcmp(kind, "aspnet") == 0) + { + extension = ".dll"; + kind = "library"; + } + else if (strcmp(kind, "winexe") == 0 || strcmp(kind, "exe") == 0) + { + extension = ".exe"; + } + else + { + printf("** Error: unknown package type '%s'\n", kind); + return 0; + } + + // Figure out what I'm building it with + + if (dotnet == NULL) + { + if (strcmp(osIdent, "windows") == 0) + csc = "csc /nologo"; + else + csc = "mcs"; + } + else if (strcmp(dotnet, "ms") == 0) + csc = "csc"; + else if (strcmp(dotnet, "pnet") == 0) + csc = "cscc"; + else if (strcmp(dotnet, "mono") == 0) + csc = "mcs"; + else + { + printf("** Error: unknown .NET runtime '%s'\n", dotnet); + return 0; + } + + // Open the package Makefile and write the header + + file = openFile(path, name, MAKEFILE_EXT); + if (file == NULL) + return 0; + + fprintf(file, "# Sub-makefile autogenerated by premake\n\n"); + + fprintf(file, "BINDIR = %s\n\n", reversePath(path, project->binaries, UNIX)); + + fprintf(file, "FLAGS =\n"); + fprintf(file, "TARGET =\n\n"); + + // Process the build configurations + + for (i = 0; i < package->numConfigs; ++i) + { + Config* config = package->config[i]; + int symbols = !inArray(config->buildFlags,"no-symbols"); + int optimize = inArray(config->buildFlags,"optimize")||inArray(config->buildFlags,"optimize-size")||inArray(config->buildFlags,"optimize-speed"); + int unsafe = inArray(config->buildFlags,"unsafe"); + + fprintf(file, "ifeq ($(CONFIG),%s)\n", config->name); + + fprintf(file, " FLAGS +="); + if (symbols) fprintf(file, " /debug"); + if (unsafe) fprintf(file, " /unsafe"); + writeList(file, config->defines, " /d:", "", "", NULL, NULL); + writeList(file, config->libPaths, " /lib:", "", "", NULL, NULL); + writeList(file, config->links, " /r:", ".dll", "", checkReferences, &i); + fprintf(file, "\n"); + + fprintf(file, " TARGET = %s%s\n", config->target, extension); + fprintf(file, "endif\n"); + } + + // Create the list of files + + fprintf(file, "\nSOURCES = \\\n"); + writeList(file, package->files, "\t", " \\\n", "", checkCsSources, NULL); + fprintf(file, "\n"); + + // Build targets + + fprintf(file, "\n.PHONY: clean\n\n"); + + fprintf(file, "$(BINDIR)/$(TARGET): $(SOURCES)\n"); + fprintf(file, "\t-@if [ ! -d $(BINDIR) ]; then mkdir -p $(BINDIR); fi\n"); + fprintf(file, "\t@%s /out:$@ /t:%s -lib:$(BINDIR) $(FLAGS) $^\n\n", csc, kind); + + fprintf(file, "clean:\n"); + fprintf(file, "\t@echo Cleaning %s\n", name); + fprintf(file, "\t-@rm -f $(BINDIR)/$(TARGET)\n"); + + fclose(file); + return 1; +} diff --git a/build/premake/src/Src/posix.c b/build/premake/src/Src/posix.c new file mode 100644 index 0000000000..3de028dff1 --- /dev/null +++ b/build/premake/src/Src/posix.c @@ -0,0 +1,179 @@ +//----------------------------------------------------------------------------- +// Premake - posix.c +// +// POSIX file and directory manipulation functions. +// +// Written by Jason Perkins (jason@379.com) +// Copyright (C) 2002 by 379, Inc. +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: posix.c,v 1.10 2004/04/16 22:18:38 jason379 Exp $ +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include + +char nativePathSep = '/'; + +#if defined(__linux__) +const char* osIdent = "linux"; +#elif defined(__FreeBSD__) +const char* osIdent = "freebsd"; +#elif defined(__NetBSD__) +const char* osIdent = "netbsd"; +#elif defined(__OpenBSD__) +const char* osIdent = "openbsd"; +#elif defined(__APPLE__) && defined(__MACH__) +const char* osIdent = "macosx"; +#else +#error Unknown OS type. +#endif + +static glob_t globbuf; +static int iGlob; + +//----------------------------------------------------------------------------- + +int plat_chdir(const char* path) +{ + return !chdir(path); +} + +//----------------------------------------------------------------------------- + +int plat_copyFile(const char* src, const char* dest) +{ + char buffer[4096]; + sprintf(buffer, "cp %s %s", src, dest); + return (system(buffer) == 0); +} + +//----------------------------------------------------------------------------- + +void plat_deleteDir(const char* path) +{ + char buffer[1024]; + strcpy(buffer, "rm -rf "); + strcat(buffer, path); + system(buffer); +} + +//----------------------------------------------------------------------------- + +void plat_deleteFile(const char* path) +{ + unlink(path); +} + +//----------------------------------------------------------------------------- + +int findLib(const char* lib, const char* path) +{ + char buffer[2048]; + struct stat sb; + + sprintf(buffer, "%s/lib%s.so", path, lib); + if (stat(buffer, &sb) == 0 && !S_ISDIR(sb.st_mode)) return 1; + + sprintf(buffer, "%s/%s.so", path, lib); + if (stat(buffer, &sb) == 0 && !S_ISDIR(sb.st_mode)) return 1; + + sprintf(buffer, "%s/%s", path, lib); + if (stat(buffer, &sb) == 0 && !S_ISDIR(sb.st_mode)) return 1; + + return 0; +} + +int plat_findLib(const char* lib, char* buffer, int size) +{ + FILE* file; + + if (findLib(lib, "/usr/lib")) + { + strcpy(buffer, "/usr/lib"); + return 1; + } + + file = fopen("/etc/ld.so.conf", "rt"); + if (file == NULL) return 0; + + while (!feof(file)) + { + // Read a line and trim off any trailing whitespace + char linebuffer[2048]; + char* ptr; + + fgets(buffer, 2048, file); + ptr = &buffer[strlen(buffer) - 1]; + while (isspace(*ptr)) + *(ptr--) = '\0'; + + if (findLib(lib, buffer)) + { + fclose(file); + return 1; + } + } + + fclose(file); + return 0; +} + +//----------------------------------------------------------------------------- + +int plat_generateUUID(char* uuid) +{ + FILE* rnd = fopen("/dev/random", "rb"); + fread(uuid, 16, 1, rnd); + fclose(rnd); +} + +//----------------------------------------------------------------------------- + +void plat_getcwd(char* buffer, int size) +{ + getcwd(buffer, size); +} + +//----------------------------------------------------------------------------- + +int plat_isAbsPath(const char* buffer) +{ + return (buffer[0] == '/'); +} + +//----------------------------------------------------------------------------- + +int plat_dirOpen(const char* mask) +{ + globbuf.gl_offs = 0; + globbuf.gl_pathc = 0; + globbuf.gl_pathv = NULL; + glob(mask, GLOB_DOOFFS | GLOB_APPEND, NULL, &globbuf); + iGlob = -1; +} + +void plat_dirClose() +{ + globfree(&globbuf); +} + +int plat_dirGetNext() +{ + return (++iGlob < globbuf.gl_pathc); +} + +const char* plat_dirGetName() +{ + char* ptr = strrchr(globbuf.gl_pathv[iGlob], '/'); + ptr = (ptr == NULL) ? globbuf.gl_pathv[iGlob] : ptr + 1; + return ptr; +} + +int plat_dirIsFile() +{ + return 1; +} diff --git a/build/premake/src/Src/premake.c b/build/premake/src/Src/premake.c new file mode 100644 index 0000000000..58a6a27b27 --- /dev/null +++ b/build/premake/src/Src/premake.c @@ -0,0 +1,218 @@ +//----------------------------------------------------------------------------- +// Premake - premake.c +// +// Program entry point and project/package file parsing. +// +// Copyright (C) 2002-2004 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: premake.c,v 1.46 2004/05/05 23:23:44 jason379 Exp $ +//----------------------------------------------------------------------------- + +#include +#include +#include "project.h" +#include "util.h" +#include "Lua/lua.h" + +#define VERSION "1.9" +#define COPYRIGHT "Copyright (C) 2002-2004 Jason Perkins" + +extern int makeGnuScripts(); +extern int makeSharpDevScripts(); +extern int makeVs6Scripts(); +extern int makeVsXmlScripts(int version); +extern int makeClean(); + +static void showCompilers(); +static void showOptions(); +static void showTargets(); +static void showUsage(); +static void showCredits(); + +const char** commandLineArgs; +const char* rootProjectFile = NULL; +const char* cc = NULL; +const char* dotnet = NULL; +int verbose = 0; + +//----------------------------------------------------------------------------- + +int main(int argc, char* argv[]) +{ + int i; + + char* filename = "premake.lua"; + args = argv; + + if (argc == 1) + { + puts("Type 'premake --help' for help"); + return 1; + } + + // Look for a '--file' command to override the default + for (i = 0; argv[i] != NULL; ++i) + { + if (strcmp(argv[i], "--file") == 0) + { + if (argv[i + 1] == NULL || strncmp(argv[i + 1], "--", 2) == 0) + { + fprintf(stderr, "Usage: --file filename"); + return 0; + } + + filename = argv[i + 1]; + break; + } + } + + // chdir() to the directory containing the project, so that relative + // paths to the packages will work + setCwd(getDirectory(filename)); + + // Remember the root project filename. This is used by the gmake generator + // to rebuild the makefiles when the premake files change + rootProjectFile = filename; + + createProject(argv); + if (!loadProject(filename)) + return 1; + + // Project must have at least one package + if (project->numPackages == 0) + { + puts("** Error: project must have at least one package."); + closeProject(); + return 0; + } + + // Process the command-line options + for (i = 0; argv[i] != NULL; ++i) + { + if (strncmp(argv[i], "--", 2) == 0) + { + if (strcmp(argv[i], "--file") == 0) + { + /* Already handled above */ ; + } + else if (strcmp(argv[i], "--help") == 0) + { + showUsage(); + } + else if (strcmp(argv[i], "--version") == 0) + { + printf("premake (Premake Build Script Generator) %s\n", VERSION); + } + else if (strcmp(argv[i], "--show-options") == 0 || + strcmp(argv[i], "--show-compilers") == 0 || + strcmp(argv[i], "--show-targets") == 0) + { + /* deprecated commands */ + printf("The option '%s' has been deprecated.\n", argv[i]); + printf("Type 'premake --help' for help.\n"); + } + else + { + handleCommand(argv, i); + } + } + } + + closeProject(); + return 0; +} + +//----------------------------------------------------------------------------- + +void defaultCommand(int argc, const char* argv[]) +{ + int result, i; + + if (strcmp(argv[0], "target") == 0) + { + for (i = 1; i < argc; ++i) + { + if (strcmp(argv[i], "gnu") == 0) + result = makeGnuScripts(); + else if (strcmp(argv[i], "sd") == 0) + result = makeSharpDevScripts(); + else if (strcmp(argv[i], "vs6") == 0) + result = makeVs6Scripts(); + else if (strcmp(argv[i], "vs7") == 0 || strcmp(argv[i], "vs2002") == 0) + result = makeVsXmlScripts(7); + else if (strcmp(argv[i], "vs2003") == 0) + result = makeVsXmlScripts(2003); + else + { + printf("** Unrecognized target '%s'\n", argv[i]); + return; + } + + if (!result) break; + } + } + else if (strcmp(argv[0], "clean") == 0) + { + makeClean(); + } + else if (strcmp(argv[0], "cc") == 0) + { + cc = argv[1]; + } + else if (strcmp(argv[0], "dotnet") == 0) + { + dotnet = argv[1]; + } + else if (strcmp(argv[0], "verbose") == 0) + { + verbose = 1; + } +} + +//----------------------------------------------------------------------------- + +static void showUsage() +{ + int i; + + printf("Premake %s, a build script generator\n", VERSION); + puts(COPYRIGHT); + printf("%s %s\n", LUA_VERSION, LUA_COPYRIGHT); + puts(""); + puts(" --file name Process the specified premake script file"); + puts(""); + puts(" --clean Remove all binaries and build scripts"); + puts(" --verbose Generate verbose makefiles (where applicable)"); + puts(""); + puts(" --cc name Choose a C/C++ compiler, if supported by target; one of:"); + puts(" gcc GNU gcc compiler"); + puts(" dmc Digital Mars C/C+ compiler"); + puts(""); + puts(" --dotnet name Choose a .NET compiler set, if supported by target; one of:"); + puts(" ms Microsoft (csc)"); + puts(" mono Mono (msc)"); + puts(" pnet Portable.NET (cscc)"); + puts(""); + puts(" --target name Generate input files for the specified toolset; one of:"); + puts(" gnu GNU Makefile for POSIX, MinGW, and Cygwin"); + puts(" sd ICSharpCode SharpDevelop"); + puts(" vs6 Microsoft Visual Studio 6"); + puts(" vs7 Microsoft Visual Studio 7"); + puts(" vs2003 Microsoft Visual Studio 2003"); + puts(""); + puts(" --help Display this information"); + puts(" --version Display version information"); + puts(""); + + if (project != NULL && project->numOptions > 0) + { + puts("This premake configuration also supports the following custom options:"); + puts(""); + + for (i = 0; i < project->numOptions; ++i) + printf(" --%-14s %s\n", project->option[i]->flag, project->option[i]->description); + } + + puts(""); +} diff --git a/build/premake/src/Src/project.c b/build/premake/src/Src/project.c new file mode 100644 index 0000000000..8644269c7b --- /dev/null +++ b/build/premake/src/Src/project.c @@ -0,0 +1,898 @@ +//----------------------------------------------------------------------------- +// Premake - project.c +// +// Functions to load and access the project data, along with all of the helper +// functions used by the project scripts. +// +// Copyright (C) 2002-2004 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: project.c,v 1.18 2004/04/14 00:15:26 jason379 Exp $ +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "Lua/lua.h" +#include "Lua/lualib.h" +#include "Lua/lauxlib.h" +#include "Lua/ldebug.h" +#include "project.h" +#include "util.h" + +extern void defaultCommand(int argc, const char** argv); + +Project* project = NULL; + +static lua_State* L; +static const char* currentScript = NULL; + +static int finishProject(); + +static int getArray(int ref, const char* name); +static int getArraySize(int ref); +static int getDeepArraySize(int ref); +static int getObjectFromArray(int ref, int i); +static const char* getString(int ref, char* name); +static const char* getStringFromArray(int ref, int index); + +static int addoption(lua_State* L); +static int copyfile(lua_State* L); +static int docommand(lua_State* L); +static int dopackage(lua_State* L); +static int ERRORMESSAGE(lua_State* L); +static int getglobal(lua_State* L); +static int findlib(lua_State* L); +static int matchfiles(lua_State* L); +static int newpackage(lua_State* L); + +//----------------------------------------------------------------------------- + +void createProject(char* argv[]) +{ + int argIndex, i; + + // Create a script environment and install the standard libraries + + L = lua_open(0); + + lua_baselibopen(L); + lua_iolibopen(L); + lua_strlibopen(L); + lua_mathlibopen(L); + + // Install the helper functions for the scripts + + lua_pushcfunction(L, addoption); + lua_setglobal(L, "option"); + + lua_pushcfunction(L, addoption); + lua_setglobal(L, "addoption"); + + lua_pushcfunction(L, copyfile); + lua_setglobal(L, "copyfile"); + + lua_pushcfunction(L, docommand); + lua_setglobal(L, "docommand"); + + lua_pushcfunction(L, dopackage); + lua_setglobal(L, "dopackage"); + + lua_pushcfunction(L, ERRORMESSAGE); + lua_setglobal(L, "_ERRORMESSAGE"); + + lua_pushcfunction(L, getglobal); + lua_settagmethod(L, LUA_TNIL, "getglobal"); + + lua_pushcfunction(L, dopackage); + lua_setglobal(L, "include"); + + lua_pushcfunction(L, findlib); + lua_setglobal(L, "findlib"); + + lua_pushcfunction(L, matchfiles); + lua_setglobal(L, "matchfiles"); + + lua_pushcfunction(L, newpackage); + lua_setglobal(L, "newpackage"); + + // Set up the registry + + lua_getregistry(L); + + lua_pushstring(L, "packages"); + lua_newtable(L); + lua_settable(L, -3); + + lua_pushstring(L, "options"); + lua_newtable(L); + lua_settable(L, -3); + + lua_pop(L, 1); + + // Set the OS variable + + lua_pushstring(L, osIdent); + lua_setglobal(L, "OS"); + + // Create and populate the options table + + lua_newtable(L); + argIndex = 0; + for (i = 1; argv[i] != NULL; ++i) + { + if (strncmp(argv[i], "--", 2) == 0) + { + if (argIndex > 0) lua_settable(L, -3); + lua_pushstring(L, argv[i] + 2); + lua_newtable(L); + argIndex = 1; + } + else if (argIndex > 0) + { + lua_pushnumber(L, argIndex++); + lua_pushstring(L, argv[i]); + lua_settable(L, -3); + } + } + if (argIndex > 0) lua_settable(L, -3); + lua_setglobal(L, "options"); + + // Create an empty project object + + lua_newtable(L); + + lua_pushstring(L, "name"); + lua_pushstring(L, "MyProject"); + lua_settable(L, -3); + + lua_pushstring(L, "path"); + lua_pushstring(L, getDirectory(currentScript)); + lua_settable(L, -3); + + lua_pushstring(L, "bindir"); + lua_pushstring(L, "."); + lua_settable(L, -3); + + lua_pushstring(L, "libdir"); + lua_pushstring(L, "."); + lua_settable(L, -3); + + lua_pushstring(L, "configs"); + lua_newtable(L); + lua_pushstring(L, "Debug"); + lua_rawseti(L, -2, 1); + lua_pushstring(L, "Release"); + lua_rawseti(L, -2, 2); + lua_settable(L, -3); + + lua_setglobal(L, "project"); +} + +//----------------------------------------------------------------------------- + +int loadProject(char* project) +{ + int result; + result = lua_dofile(L, project); + if (result == LUA_ERRFILE) + { + /* Try "${project}.lua" */ + char buffer[4096]; + strcpy(buffer, project); + strcat(buffer, ".lua"); + result = lua_dofile(L, buffer); + } + + if (result == 0) + result = finishProject(); + + if (result != 0) + lua_close(L); + + return (result == 0); +} + +//----------------------------------------------------------------------------- + +void handleCommand(char* args[], int i) +{ + int j; + + // Try to find a command processor + lua_getglobal(L, "docommand"); + if (!lua_isfunction(L, -1)) + return; + + // Push the command and it's arguments onto the stack + lua_pushstring(L, args[i] + 2); + for (j = i + 1; args[j] != NULL && strncmp(args[j], "--", 2) != 0; ++j) + lua_pushstring(L, args[j]); + + // Call the command processor + lua_call(L, j - i, 0); +} + +//----------------------------------------------------------------------------- + +int getProject() +{ + lua_getglobal(L, "project"); + return lua_ref(L, 0); +} + +//----------------------------------------------------------------------------- + +Package* getPackage(const char* name) +{ + int i; + for (i = 0; i < project->numPackages; ++i) + { + if (strcmp(project->package[i]->name, name) == 0) + return project->package[i]; + } + return NULL; +} + +//----------------------------------------------------------------------------- + +void configureProject() +{ + int top = lua_gettop(L); + lua_getglobal(L, "project"); + lua_pushstring(L, "configure"); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) + lua_call(L, 0, 0); + lua_settop(L, top); +} + +//----------------------------------------------------------------------------- + +static void getConfigList(int package, int config, const char* list, const char*** array, int* length) +{ + const char** buffer; + int size, i; + + int pkgRef = getArray(package, list); + int pkgLen = getDeepArraySize(pkgRef); + int cfgRef = getArray(config, list); + int cfgLen = getDeepArraySize(cfgRef); + + size = pkgLen + cfgLen; + buffer = (const char**)malloc(sizeof(char**) * (size + 1)); + buffer[size] = NULL; + + for (i = 0; i < pkgLen; ++i) + buffer[i] = getStringFromArray(pkgRef, i); + for (i = 0; i < cfgLen; ++i) + buffer[i + pkgLen] = getStringFromArray(cfgRef, i); + + *array = buffer; + *length = size; +} + +static int finishProject() +{ + int i, optlist, packages; + + project = (Project*)malloc(sizeof(Project)); + + project->name = getString(getProject(), "name"); + if (strchr(project->name, ' ') != NULL) + puts("** Warning: not all generators allow spaces in the project name."); + + project->path = getString(getProject(), "path"); + project->binaries = getString(getProject(), "bindir"); + project->libraries = getString(getProject(), "libdir"); + + optlist = getArray(-1, "options"); + project->numOptions = getArraySize(optlist); + project->option = (Option**)malloc(sizeof(Option*) * (project->numOptions + 1)); + project->option[project->numOptions] = NULL; + for (i = 0; i < project->numOptions; ++i) + { + int opt = getObjectFromArray(optlist, i); + Option* option = (Option*)malloc(sizeof(Option)); + project->option[i] = option; + option->flag = (char*)getStringFromArray(opt, 0); + option->description = (char*)getStringFromArray(opt, 1); + } + + packages = getArray(-1, "packages"); + project->numPackages = getArraySize(packages); + project->package = (Package**)malloc(sizeof(Package**) * (project->numPackages + 1)); + project->package[project->numPackages] = NULL; + + for (i = 0; i < project->numPackages; ++i) + { + int pkg, files, configs, j; + + Package* package = (Package*)malloc(sizeof(Package)); + project->package[i] = package; + + pkg = getObjectFromArray(packages, i); + + files = getArray(pkg, "files"); + package->numFiles = getDeepArraySize(files); + package->files = (const char**)malloc(sizeof(char**) * (package->numFiles + 1)); + package->files[package->numFiles] = NULL; + for (j = 0; j < package->numFiles; ++j) + package->files[j] = getStringFromArray(files, j); + + package->name = getString(pkg, "name"); + package->script = getString(pkg, "script"); + package->path = getString(pkg, "path"); + package->language = getString(pkg, "language"); + package->kind = getString(pkg, "kind"); + package->url = getString(pkg, "url"); + package->data = NULL; + + configs = getArray(pkg, "config"); + package->numConfigs = getArraySize(configs); + package->config = (Config**)malloc(sizeof(Config*) * (package->numConfigs + 1)); + package->config[package->numConfigs] = NULL; + + for (j = 0; j < package->numConfigs; ++j) + { + int cfg; + + Config* config = (Config*)malloc(sizeof(Config)); + package->config[j] = config; + + cfg = getObjectFromArray(configs, j); + + config->name = getString(cfg, "name"); + + config->target = getString(cfg, "target"); + if (config->target == NULL) config->target = getString(pkg, "target"); + if (config->target == NULL) config->target = package->name; + + config->pchHeader = getString(cfg, "pchHeader"); + if (!config->pchHeader) + config->pchHeader = getString(pkg, "pchHeader"); + + config->pchSource = getString(cfg, "pchSource"); + if (!config->pchSource) + config->pchSource = getString(pkg, "pchSource"); + + getConfigList(pkg, cfg, "buildflags", &config->buildFlags, &config->numBuildFlags); + getConfigList(pkg, cfg, "buildoptions", &config->buildOptions, &config->numBuildOptions); + getConfigList(pkg, cfg, "defines", &config->defines, &config->numDefines); + getConfigList(pkg, cfg, "includepaths", &config->includePaths, &config->numIncludePaths); + getConfigList(pkg, cfg, "libpaths", &config->libPaths, &config->numLibPaths); + getConfigList(pkg, cfg, "linkflags", &config->linkFlags, &config->numLinkFlags); + getConfigList(pkg, cfg, "linkoptions", &config->linkOptions, &config->numLinkOptions); + getConfigList(pkg, cfg, "links", &config->links, &config->numLinks); + } + } + + return 0; +} + +//----------------------------------------------------------------------------- + +void closeProject() +{ + int i, j; + + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + + for (j = 0; j < package->numConfigs; ++j) + { + Config* config = package->config[j]; + free((char**)config->buildFlags); + free((char**)config->buildOptions); + free((char**)config->defines); + free((char**)config->includePaths); + free((char**)config->libPaths); + free((char**)config->linkFlags); + free((char**)config->linkOptions); + free((char**)config->links); + free(package->config[j]); + } + free(package->config); + if (package->data) free(package->data); + free(package); + } + + free(project->package); + free(project); + project = NULL; +} + +//----------------------------------------------------------------------------- + +static int getArray(int ref, const char* name) +{ + if (ref == -1) + ref = LUA_REFREGISTRY; + + lua_getref(L, ref); + lua_pushstring(L, name); + lua_gettable(L, -2); + ref = lua_ref(L, -1); + + lua_pop(L, 1); + return ref; +} + +//----------------------------------------------------------------------------- + +static int getArraySize(int ref) +{ + if (ref > 0) + { + int size; + lua_getref(L, ref); + size = lua_getn(L, -1); + lua_pop(L, 1); + return size; + } + + return 0; +} + +static int getDeepArraySize(int ref) +{ + int i, size = 0; + if (ref == 0) return 0; + + lua_getref(L, ref); + for (i = 1; i <= lua_getn(L,-1); ++i) + { + lua_rawgeti(L, -1, i); + if (lua_istable(L, -1)) + { + size += getDeepArraySize(lua_ref(L,0)); + } + else + { + lua_pop(L, 1); + ++size; + } + } + + lua_pop(L, 1); + return size; +} + +//----------------------------------------------------------------------------- + +static int getObjectFromArray(int ref, int i) +{ + lua_getref(L, ref); + lua_rawgeti(L, -1, i + 1); + ref = lua_ref(L, -1); + lua_pop(L, 1); + return ref; +} + +//----------------------------------------------------------------------------- + +static const char* getString(int ref, char* name) +{ + const char* str; + lua_getref(L, ref); + lua_pushstring(L, name); + lua_gettable(L, -2); + str = lua_tostring(L, -1); + lua_pop(L, 2); + + return str; +} + +//----------------------------------------------------------------------------- + +static const char* goDeep(int ref, int* index) +{ + int i; + const char* str = NULL; + + lua_getref(L, ref); + for (i = 1; i <= lua_getn(L,-1) && *index >= 0; ++i) + { + lua_rawgeti(L, -1, i); + if (lua_istable(L, -1)) + { + str = goDeep(lua_ref(L,0), index); + if (str != NULL) + return str; + } + else if (*index == 0) + { + str = lua_tostring(L, -1); + lua_pop(L, 1); + break; + } + else + { + lua_pop(L, 1); + --(*index); + } + } + + lua_pop(L, 1); + return str; +} + +static const char* getStringFromArray(int ref, int index) +{ + return goDeep(ref, &index); +} + +//----------------------------------------------------------------------------- + +void setProjectOption(char* option) +{ + lua_getglobal(L, "options"); + lua_pushstring(L, option); + lua_pushnumber(L, 1); + lua_settable(L, -3); + lua_pop(L, 1); +} + +//----------------------------------------------------------------------------- + +static void createEmptyConfig(lua_State* L, const char* name) +{ + lua_newtable(L); + + if (name != NULL) + { + lua_pushstring(L, "name"); + lua_pushstring(L, name); + lua_settable(L, -3); + } + + lua_pushstring(L, "buildflags"); + lua_newtable(L); + if (name != NULL && strcmp(name, "Release") == 0) { + lua_pushstring(L, "no-symbols"); + lua_rawseti(L, -2, 1); + lua_pushstring(L, "optimize"); + lua_rawseti(L, -2, 2); + } + lua_settable(L, -3); + + lua_pushstring(L, "buildoptions"); + lua_newtable(L); + lua_settable(L, -3); + + lua_pushstring(L, "defines"); + lua_newtable(L); + lua_settable(L, -3); + + lua_pushstring(L, "includepaths"); + lua_newtable(L); + lua_settable(L, -3); + + lua_pushstring(L, "libpaths"); + lua_newtable(L); + lua_settable(L, -3); + + lua_pushstring(L, "linkflags"); + lua_newtable(L); + lua_settable(L, -3); + + lua_pushstring(L, "linkoptions"); + lua_newtable(L); + lua_settable(L, -3); + + lua_pushstring(L, "links"); + lua_newtable(L); + lua_settable(L, -3); +} + +/*----------------------------------------------------------------------------- + * The registry stores the list of projects and packages. This function will + * add the table at the top of the stack to one of these lists. */ + +static void registerTable(lua_State* L, char* listname) +{ + int n; + + lua_getregistry(L); + + lua_pushstring(L, listname); + lua_gettable(L, -2); + lua_pushvalue(L, -3); + + n = lua_getn(L, -2); + lua_rawseti(L, -2, n + 1); + + lua_pop(L, 2); // remove list and registry +} + +//----------------------------------------------------------------------------- + +static int addoption(lua_State* L) +{ + lua_getregistry(L); + lua_pushstring(L, "options"); + lua_gettable(L, -2); + + lua_newtable(L); + lua_pushvalue(L, 1); + lua_rawseti(L, -2, lua_getn(L,-2) + 1); + + lua_pushvalue(L, 2); + lua_rawseti(L, -2, lua_getn(L,-2) + 1); + + lua_rawseti(L, -2, lua_getn(L,-2) + 1); + + lua_pop(L, 2); + return 0; +} + +//----------------------------------------------------------------------------- + +static int copyfile(lua_State* L) +{ + const char* src = luaL_check_string(L, 1); + const char* dest = luaL_check_string(L, 2); + if (copyFile(src, dest)) + lua_pushnumber(L, 1); + else + lua_pushnil(L); + return 1; +} + +//----------------------------------------------------------------------------- + +static int docommand(lua_State* L) +{ + int argc, i; + const char** argv; + + /* If this function is overriden in Lua, the second parameter will be a + * table. Otherwise there will be zero or more string parameters. */ + if (lua_gettop(L) > 1 && !lua_isnil(L,2)) + { + if (lua_istable(L, 2)) + { + argc = lua_getn(L, 2) + 1; + argv = (const char**)malloc(sizeof(char*) * argc); + argv[0] = luaL_check_string(L, 1); + for (i = 1; i < argc; ++i) + { + lua_rawgeti(L, 2, i); + argv[i] = luaL_check_string(L, -1); + lua_pop(L, 1); + } + } + else + { + argc = lua_gettop(L); + argv = (const char**)malloc(sizeof(char*) * argc); + for (i = 0; i < lua_gettop(L); ++i) + argv[i] = luaL_check_string(L, i + 1); + } + } + else + { + argc = 1; + argv = (const char**)malloc(sizeof(char*)); + argv[0] = luaL_check_string(L, 1); + } + + defaultCommand(argc, argv); + + free((char*)argv); + return 0; +} + +//----------------------------------------------------------------------------- + +static int dopackage(lua_State* L) +{ + int result; + currentScript = luaL_check_string(L, 1); + + lua_pushnil(L); + lua_setglobal(L, "package"); + + lua_pushvalue(L, 1); + lua_pushstring(L, "/premake.lua"); + lua_concat(L, 2); + currentScript = lua_tostring(L, -1); + result = lua_dofile(L, currentScript); + if (result == LUA_ERRFILE) + { + currentScript = lua_tostring(L, 1); + result = lua_dofile(L, currentScript); + } + + currentScript = NULL; + return 0; +} + +//----------------------------------------------------------------------------- + +static int ERRORMESSAGE(lua_State* L) +{ + lua_Debug ar; + int stack; + + const char* msg = lua_tostring(L, 1); + printf("\n** Error: %s\n", msg); + + for (stack = 0; lua_getstack(L, stack, &ar); ++stack) + { + lua_getinfo(L, "S1", &ar); + if (ar.source && ar.currentline > 0) + { + printf("<%.70s: line %d>\n\n", ar.short_src, ar.currentline); + break; + } + } + + return 0; +} + +//----------------------------------------------------------------------------- + +static int findlib(lua_State* L) +{ + const char* libname = luaL_check_string(L, 1); + const char* result = findSharedLib(libname); + if (result) + lua_pushstring(L, result); + else + lua_pushnil(L); + return 1; +} + +//----------------------------------------------------------------------------- + +static int getglobal(lua_State* L) +{ + const char* name = lua_tostring(L, 1); + if (strcmp(name, "package") == 0) + { + + newpackage(L); + lua_pushvalue(L, -1); + lua_setglobal(L, "package"); + return 1; + } + + return 0; +} + +//----------------------------------------------------------------------------- + +static int matchfiles(lua_State* L) +{ + const char* path; + int i, numArgs; + + /* How many masks were passed in? */ + numArgs = lua_gettop(L); + + /* Get the current package path */ + lua_getglobal(L, "package"); + lua_pushstring(L, "path"); + lua_gettable(L, -2); + if (lua_isstring(L, -1)) + { + path = lua_tostring(L, -1); + } + else + { + if (currentScript != NULL) + path = currentScript; + else + path = "."; + } + lua_pop(L, 2); + + lua_newtable(L); + for (i = 1; i <= numArgs; ++i) + { + const char* mask = luaL_check_string(L, i); + int usePrefix = strcmp(getDirectory(mask), ".") != 0; + + dirOpen(path, mask); + while (dirGetNext()) + { + if (dirIsFile()) + { + if (usePrefix) + { + const char* result; + lua_pushstring(L, getDirectory(mask)); + lua_pushstring(L, dirGetName()); + lua_concat(L, 2); + result = lua_tostring(L, -1); + } + else + { + lua_pushstring(L, dirGetName()); + } + + lua_rawseti(L, -2, lua_getn(L,-2) + 1); + } + } + dirClose(); + } + + return 1; +} + +//----------------------------------------------------------------------------- + +static int newpackage(lua_State* L) +{ + int configs; + int n; + + createEmptyConfig(L, NULL); + + // Add the package to the master list in the registry + + lua_getregistry(L); + lua_pushstring(L, "packages"); + lua_gettable(L, -2); + n = lua_getn(L, -1); + + lua_pushvalue(L, -3); + lua_rawseti(L, -2, n + 1); + lua_pop(L, 2); + + // Set default values + + lua_pushstring(L, "name"); + if (n == 0) + lua_pushstring(L, getString(getProject(), "name")); + else + { + lua_pushstring(L, "Package"); + lua_pushnumber(L, n + 1); + lua_concat(L, 2); + } + lua_settable(L, -3); + + lua_pushstring(L, "script"); + lua_pushstring(L, currentScript); + lua_settable(L, -3); + + lua_pushstring(L, "path"); + lua_pushstring(L, getDirectory(currentScript)); + lua_settable(L, -3); + + lua_pushstring(L, "language"); + lua_pushstring(L, "c++"); + lua_settable(L, -3); + + lua_pushstring(L, "kind"); + lua_pushstring(L, "winexe"); + lua_settable(L, -3); + + lua_pushstring(L, "files"); + lua_newtable(L); + lua_settable(L, -3); + + /* Build list of configurations that can be indexed by name or number */ + lua_pushstring(L, "config"); + lua_newtable(L); + + configs = getArray(getProject(), "configs"); + for (n = 0; n < getArraySize(configs); ++n) + { + const char* name = getStringFromArray(configs, n); + lua_pushstring(L, name); + createEmptyConfig(L, name); + lua_settable(L, -3); + + lua_pushstring(L, name); + lua_gettable(L, -2); + lua_rawseti(L, -2, n + 1); + } + + lua_settable(L, -3); + + return 1; +} diff --git a/build/premake/src/Src/project.h b/build/premake/src/Src/project.h new file mode 100644 index 0000000000..c10b3549c3 --- /dev/null +++ b/build/premake/src/Src/project.h @@ -0,0 +1,81 @@ +//----------------------------------------------------------------------------- +// Premake - project.h +// +// An interface to the project settings. +// +// Copyright (C) 2002-2004 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: project.h,v 1.10 2004/03/27 13:42:24 jason379 Exp $ +//----------------------------------------------------------------------------- + +typedef struct _Config +{ + const char* name; + const char* target; + const char** buildFlags; + const char** buildOptions; + const char** defines; + const char** includePaths; + const char** libPaths; + const char** linkFlags; + const char** linkOptions; + const char** links; + const char* pchHeader; + const char* pchSource; + int numBuildFlags; + int numBuildOptions; + int numDefines; + int numIncludePaths; + int numLibPaths; + int numLinkFlags; + int numLinkOptions; + int numLinks; +} Config; + +typedef struct _Package +{ + const char* name; + const char* script; + const char* path; + const char* language; + const char* kind; + const char* url; + const char** files; + int numFiles; + Config** config; + int numConfigs; + void* data; +} Package; + +typedef struct _Option +{ + char* flag; + char* description; + struct _Option* next; +} Option; + +typedef struct _Project +{ + const char* name; + const char* binaries; + const char* libraries; + const char* path; + Package** package; + Option** option; + int numPackages; + int numOptions; +} Project; + + +extern Project* project; + +extern void createProject(char* argv[]); +extern int loadProject(char* project); +extern void closeProject(); +extern void handleCommand(char* args[], int i); + +// Deprecated? +extern Package* getPackage(const char* name); +extern void configureProject(); +extern void setProjectOption(char* option); diff --git a/build/premake/src/Src/sharpdev.c b/build/premake/src/Src/sharpdev.c new file mode 100644 index 0000000000..faacd65e8e --- /dev/null +++ b/build/premake/src/Src/sharpdev.c @@ -0,0 +1,356 @@ +//----------------------------------------------------------------------------- +// Premake - sharpdev.c +// +// ICSharpCode SharpDevelop tool target. +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// Written by Chris McGuirk (leedgitar@latenitegames.com) +// Modified by Jason Perkins +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "project.h" +#include "util.h" + +static char buffer[4096]; + +static int writeCombine(); +static int writeCsProject(Package* package); + +extern const char* dotnet; + +//----------------------------------------------------------------------------- + +int makeSharpDevScripts() +{ + int i; + + puts("Generating SharpDevelop combine and project files:"); + + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + + printf("...%s\n", package->name); + + if (strcmp(package->language, "c#") == 0) + { + if (!writeCsProject(package)) + return 0; + } + + else if (strcmp(package->language, "c++") == 0 || strcmp(package->language, "c") == 0) + { + printf("** Error: SharpDevelop does not support C/C++ development.\n"); + return 0; + } + + else + { + printf("** Error: unrecognized language '%s'\n", package->language); + return 0; + } + } + + if (!writeCombine()) + return 0; + + return 1; +} + +//----------------------------------------------------------------------------- + +static int writeCombine() +{ + int i, j, k; + + FILE* file; + file = openFile(project->path, project->name, ".cmbx"); + if (file == NULL) + return 0; + + fprintf(file, "\n", project->name); + + // TODO: select the first executable project + // pick the first project as the startup by default in the meantime + if(project->numPackages != 0) + { + fprintf(file, " \n", project->package[0]->name); + } + + // first write out the startup entries + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + const char* name = package->name; + fprintf(file, " \n", name); + } + + fprintf(file, " \n"); + fprintf(file, " \n"); + + // now write out the project entries + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + const char* name = package->name; + const char* path = reversePath(project->path, package->path, NATIVE); + fprintf(file, " \n", path, name, "prjx"); + } + + fprintf(file, " \n"); + fprintf(file, " \n"); + + // write out the entries for each build configuration + for (i = 0; i < project->package[0]->numConfigs; ++i) + { + const char* configName = project->package[0]->config[i]->name; + + fprintf(file, " \n", configName); + + // loop through each package. if has a configuration matching the curent one, write an entry + for(j = 0; j < project->numPackages; j++) + { + Package* package = project->package[j]; + const char* name = package->name; + + int isIncluded = 0; + + // look at each of this projects configs + for(k = 0; k < package->numConfigs; k++) + { + if(strcmp(configName, package->config[k]->name) != 0) + { + isIncluded = 1; + break; + } + } + + // write the entry for the current project in this build configuration + fprintf(file, " \n", package->name, configName, isIncluded ? "True" : "False"); + } + + fprintf(file, " \n"); + } + + fprintf(file, " \n"); + fprintf(file, ""); + + // Finish + fclose(file); + return 1; +} + +//----------------------------------------------------------------------------- + +static const char* checkDir(const char* path, void* data) +{ + return translatePath(path, WIN32); +} + +static const char* checkLibs(const char* file, void* data) +{ + Package* package = getPackage(file); + if (package == NULL) return file; + if (strcmp(package->language, "c#") != 0) return NULL; + return package->config[*((int*)data)]->target; +} + +//----------------------------------------------------------------------------- + +static const char* checkRefs(const char* ref, void* data) +{ + int i; + int isSibling = 0; + const char* fileName = getFilename(ref, 0); + + strcpy(buffer," type=\""); + + // Is this a sibling project? + for (i = 0; i < project->numPackages; ++i) + { + if (strcmp(project->package[i]->name, ref) == 0) + { + isSibling = 1; + break; + } + } + + if(isSibling) + { + strcat(buffer, "Project\""); + strcat(buffer, " refto=\""); + strcat(buffer, fileName); + strcat(buffer, "\" localcopy=\"True\""); + } + else + { + const char* ext = strchr(ref,',') ? "" : ".dll"; + + // See if this assembly exists on one of the link paths + Package* package = (Package*)data; + if (fileExists(project->binaries, ref, ext)) + { + strcat(buffer, "Assembly\" refto=\""); + strcat(buffer, reversePath(package->path, project->binaries, NATIVE)); + strcat(buffer, "/"); + strcat(buffer, ref); + strcat(buffer, ".dll\" localcopy=\"False\""); + } + else + { + strcat(buffer, "Gac\" refto=\""); + strcat(buffer, ref); + strcat(buffer, ext); + strcat(buffer, "\" localcopy=\"False\""); + } + } + + return buffer; +} + +static const char* checkRefPaths(const char* ref, void* data) +{ + const char* projPath = (const char*)data; + return makeAbsolute(projPath, ref); +} + +static const char* checkSrcFileType(const char* file, void* data) +{ + const char* ext; + + strcpy(buffer, translatePath(file, WIN32)); + strcat(buffer, "\" subtype=\"Code\" "); + + ext = getExtension(file); + if (strcmp(ext, ".cs") == 0) + { + strcat(buffer, "BuildAction=\"Compile\""); + } + else if (strcmp(ext, ".resx") == 0) + { + strcat(buffer, "BuildAction=\"EmbedAsResource\""); + } + else + { + strcat(buffer, "BuildAction=\"Nothing\""); + } + + return buffer; +} + +static int writeCsProject(Package* package) +{ + FILE* file; + const char* runtime; + const char* csc; + int i; + + const char* name = package->name; + const char* path = package->path; + const char* kind = package->kind; + + if (strcmp(kind, "winexe") == 0) + kind = "WinExe"; + else if (strcmp(kind, "exe") == 0) + kind = "Exe"; + else if (strcmp(kind, "dll") == 0 || strcmp(kind, "aspnet") == 0) + kind = "Library"; + else + { + printf("** Error: unknown package kind '%s'\n", kind); + return 0; + } + + // Figure out what .net environment I'm using + if (dotnet == NULL) + dotnet = (strcmp(osIdent, "windows") == 0) ? "ms" : "mono"; + + if (strcmp(dotnet, "ms") == 0) + { + runtime = "MsNet"; + csc = "Csc"; + } + else if (strcmp(dotnet, "mono") == 0) + { + runtime = "Mono"; + csc = "Mcs"; + } + else if (strcmp(dotnet, "pnet") == 0) + { + printf("** Error: SharpDevelop does not yet support Portable.NET\n"); + return 0; + } + else + { + printf("** Error: unknown .NET runtime '%s'\n", dotnet); + return 0; + } + + + // Open the project file and write the header + file = openFile(path, name, ".prjx"); + if (file == NULL) + return 0; + + // Project Header + fprintf(file, "\n", name); + + // File List + fprintf(file, " \n"); + writeList(file, package->files, " \n", "", checkSrcFileType, NULL); + fprintf(file, " \n"); + + // References + fprintf(file, " \n"); + writeList(file, package->config[0]->links, " \n", "", checkRefs, package); + fprintf(file, " \n"); + + // Configurations + fprintf(file, " \n", package->config[0]->name); + + for (i = 0; i < package->numConfigs; ++i) + { + Config* config = package->config[i]; + + int symbols = !inArray(config->buildFlags, "no-symbols"); + int optimize = inArray(config->buildFlags, "optimize") || inArray(config->buildFlags, "optimize-size") || inArray(config->buildFlags, "optimize-speed"); + int unsafe = inArray(config->buildFlags, "unsafe"); + + fprintf(file, " \n", config->name); + fprintf(file, " defines, "", "", ";", NULL, NULL); + fprintf(file, "\" "); + fprintf(file, "generatexmldocumentation=\"False\" "); + fprintf(file, "/>\n"); + + fprintf(file, " binaries, NATIVE)); + insertPath(file, getDirectory(config->target), NATIVE); + fprintf(file, "\" "); + fprintf(file, "assembly=\"%s\" ", getFilename(config->target,0)); + fprintf(file, "executeScript=\"\" "); + fprintf(file, "executeBeforeBuild=\"\" "); + fprintf(file, "executeAfterBuild=\"\" "); + fprintf(file, "/>\n"); + + fprintf(file, " \n", config->name); + } + + fprintf(file, " \n"); + fprintf(file, "\n"); + + fclose(file); + return 1; +} diff --git a/build/premake/src/Src/util.c b/build/premake/src/Src/util.c new file mode 100644 index 0000000000..7130cf31af --- /dev/null +++ b/build/premake/src/Src/util.c @@ -0,0 +1,566 @@ +//----------------------------------------------------------------------------- +// Premake - util.c +// +// Premake utility functions +// +// Copyright (C) 2002-2003 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: util.c,v 1.19 2004/03/27 13:42:24 jason379 Exp $ +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "project.h" +#include "util.h" + +char** args; + +static char buffer[4096]; +static char buffer2[4096]; + +static char pathseps[] = { '/', '\\' }; + +extern int plat_chdir(const char* path); +extern int plat_copyFile(const char* src, const char* dest); +extern void plat_deleteDir(const char* path); +extern void plat_deleteFile(const char* path); +extern int plat_findLib(const char* lib, char* buffer, int size); +extern void plat_generateUUID(const char* uuid); +extern void plat_getcwd(char* buffer, int size); +extern int plat_isAbsPath(const char* path); + +extern int plat_dirOpen(const char* mask); +extern void plat_dirClose(); +extern int plat_dirGetNext(); +extern const char* plat_dirGetName(); +extern int plat_dirIsFile(); + +//----------------------------------------------------------------------------- + +int copyFile(const char* src, const char* dest) +{ + translatePath(src, NATIVE); // copies into buffer2 + strcpy(buffer, buffer2); + translatePath(dest, NATIVE); + return plat_copyFile(buffer, buffer2); +} + +//----------------------------------------------------------------------------- + +void deleteDirectory(const char* directory, const char* name) +{ + strcpy(buffer, directory); + if (strlen(directory) > 0) strcat(buffer, "/"); + strcat(buffer, name); + plat_deleteDir(translatePath(buffer, NATIVE)); +} + +//----------------------------------------------------------------------------- + +void deleteFile(const char* directory, const char* name, const char* extension) +{ + strcpy(buffer, directory); + if (strlen(buffer) > 0) strcat(buffer, "/"); + strcat(buffer, name); + strcat(buffer, extension); + plat_deleteFile(buffer); +} + +//----------------------------------------------------------------------------- + +int endsWith(const char* haystack, const char* needle) +{ + if (strlen(haystack) < strlen(needle)) + return 0; + + haystack = haystack + strlen(haystack) - strlen(needle); + return (strcmp(haystack, needle) == 0); +} + +//----------------------------------------------------------------------------- + +int fileExists(const char* path, const char* name, const char* extension) +{ + FILE* file; + char buffer[512]; + + strcpy(buffer, path); + if (path && strlen(path) > 0) + strcat(buffer, "/"); + strcat(buffer, name); + strcat(buffer, extension); + + file = fopen(buffer, "r"); + if (file != NULL) + { + fclose(file); + return 1; + } + + return 0; +} + +//----------------------------------------------------------------------------- + +const char* findSharedLib(const char* lib) +{ + if (plat_findLib(lib, buffer, 4096)) + return buffer; + return NULL; +} + +//----------------------------------------------------------------------------- + +static void stringify(unsigned char* src, char* dst, int count) +{ + char buffer[4]; + int i; + + for (i = 0; i < count; ++i) + { + sprintf(buffer, "%X", (int)src[i]); + + if (src[i] >= 0x10) + { + *(dst++) = buffer[0]; + *(dst++) = buffer[1]; + } + else + { + *(dst++) = '0'; + *(dst++) = buffer[0]; + } + } +} + +void generateUUID(char* uuid) +{ + plat_generateUUID(buffer); + + stringify(buffer, uuid, 4); + uuid[8] = '-'; + stringify(buffer + 4, uuid + 9, 2); + uuid[13] = '-'; + stringify(buffer + 6, uuid + 14, 2); + uuid[18] = '-'; + stringify(buffer + 8, uuid + 19, 2); + uuid[23] = '-'; + stringify(buffer + 10, uuid + 24, 6); + uuid[36] = '\0'; +} + +//----------------------------------------------------------------------------- + +const char* getDirectory(const char* path) +{ + char* ptr; + if (path != NULL) + { + strcpy(buffer, path); + for (ptr = buffer; *ptr; ptr++) + { + if (*ptr == '\\') + *ptr = '/'; + } + + ptr = strrchr(buffer, '/'); + if (ptr != NULL) + { + *(++ptr) = '\0'; + return buffer; + } + } + + return "."; +} + +//----------------------------------------------------------------------------- + +const char* getExtension(const char* path) +{ + if (path != NULL) + { + const char* ptr = strrchr(path, '.'); + return ptr; + } + + return NULL; +} + +//----------------------------------------------------------------------------- + +const char* getFilename(const char* path, int trim) +{ + if (path != NULL) + { + char* ptr = strrchr(path, '/'); + ptr = (ptr != NULL) ? ++ptr : (char*)path; + strcpy(buffer, ptr); + + if (trim) + { + ptr = strrchr(buffer, '.'); + if (ptr != NULL) *ptr = '\0'; + } + + return buffer; + } + + return NULL; +} + +//----------------------------------------------------------------------------- + +int hasOption(char* option) +{ + char** arg; + for (arg = args; *arg != NULL; ++arg) + { + if (strlen(*arg) == strlen(option) + 2 && strcmp((*arg) + 2, option) == 0) + { + return 1; + } + } + + return 0; +} + +//----------------------------------------------------------------------------- + +int inArray(const char** list, const char* value) +{ + while (*list) + { + if (strcmp(*list, value) == 0) + return 1; + ++list; + } + return 0; +} + +//----------------------------------------------------------------------------- + +void insertPath(FILE* file, const char* path, int type) +{ + if (strcmp(path, ".") != 0) + fprintf(file, translatePath(path, type)); +} + +//----------------------------------------------------------------------------- + +int isCppFile(const char* file) +{ + int i; + const char* ext = getExtension(file); + for (i = 0; CPP_EXT[i] != NULL; ++i) + { + if (strcmp(ext, CPP_EXT[i]) == 0) + return 1; + } + + return 0; +} + +//----------------------------------------------------------------------------- +// This function does some gyrations to handle the case where the requested +// directory doesn't actually exist. It tries to still give a reasonable path. + +const char* makeAbsolute(const char* base, const char* path) +{ + const char* ptr; + + // If the directory is already absolute I don't have to do anything + if (plat_isAbsPath(path)) + return translatePath(path, NATIVE); + + // chdir() to the package directory + plat_getcwd(buffer, 4096); + if (!plat_chdir(translatePath(base, NATIVE))) + { + plat_chdir(buffer); + return NULL; + } + + // Back my way up the tree + ptr = path; + while (*ptr == '.' || *ptr == '/') + { + if (strncmp(ptr, "..", 2) == 0) + { + plat_chdir(".."); + ptr += 2; + } + else + { + ptr++; + } + } + + +/* OBSOLETE + while (*ptr == '.') + { + if (strncmp(ptr, "../", 3) == 0) + { + plat_chdir(".."); + ptr += 3; + } + else if (strncmp(ptr, "./", 2) == 0) + { + ptr += 2; + } + else if (*(ptr + 1) == '\0') + { + ptr++; + } + } +*/ + + // Tack the remained of the path onto my current location + plat_getcwd(buffer2, 4096); + strcat(buffer2, "/"); + strcat(buffer2, ptr); + + for (ptr = buffer2; *ptr; ++ptr) + { + if (*ptr == '/') + *((char*)ptr) = nativePathSep; + } + + plat_chdir(buffer); + return buffer2; +} + +//----------------------------------------------------------------------------- + +FILE* openFile(const char* path, const char* name, const char* extension) +{ + FILE* file; + char buffer[512]; + + strcpy(buffer, path); + if (path && strlen(path) > 0) + strcat(buffer, "/"); + strcat(buffer, name); + strcat(buffer, extension); + + file = fopen(buffer, "wt"); + if (file == NULL) + printf("** Error: unable to open file '%s'\n", buffer); + + return file; +} + +//----------------------------------------------------------------------------- + +const char* replaceChars(const char* str, const char* replace) +{ + int i; + for (i = 0; i < (int)strlen(str); ++i) + buffer[i] = (strchr(replace, str[i]) == NULL) ? str[i] : '_'; + buffer[strlen(str)] = '\0'; + return buffer; +} + +//----------------------------------------------------------------------------- + +const char* replaceExtension(const char* path, const char* extension) +{ + char* ptr = strrchr(path, '.'); + if (ptr != NULL) + { + strncpy(buffer, path, ptr - path); + buffer[ptr - path] = '\0'; + } + else + strcpy(buffer, path); + strcat(buffer, extension); + return buffer; +} + +//----------------------------------------------------------------------------- + +const char* reversePath(const char* path, const char* subdir, int type) +{ + char origin[2048]; + char destination[2048]; + int start, i; + + // Get the full path to both locations + strcpy(origin, makeAbsolute(".", path)); + strcpy(destination, makeAbsolute(".", subdir)); + + // Trim off common directories + start = 0; + i = 0; + while (origin[i] && destination[i] && origin[i] == destination[i]) + { + if (origin[i] == nativePathSep) + start = i + 1; + ++i; + } + + // Build the return path + if (strlen(origin) - start > 0) + { + int i = start; + strcpy(buffer, ".."); + for ( ; origin[i]; ++i) + { + if (origin[i] == nativePathSep && origin[i+1] != '\0') + strcat(buffer, "/.."); + } + } + else + { + strcpy(buffer, "."); + } + + if (strlen(destination) - start > 0) + { + strcat(buffer, "/"); + strcat(buffer, destination + start); + } + + // It must end with a separator + if (buffer[strlen(buffer)-1] != '/' && buffer[strlen(buffer)-1] != '\\') strcat(buffer, "/"); + + return translatePath(buffer, type); +} + +//----------------------------------------------------------------------------- + +const char* translatePath(const char* path, int type) +{ + char* ptr; + char sep = (type == NATIVE) ? type = nativePathSep : pathseps[type]; + + strcpy(buffer2, path); + for (ptr = buffer2; *ptr != '\0'; ++ptr) + { + if (*ptr == '/' || *ptr == '\\') + *ptr = sep; + } + + return buffer2; +} + +//----------------------------------------------------------------------------- + +void walkSourceList(FILE* file, Package* package, const char* path, void (*cb)(FILE*, const char*, int)) +{ + const char** i; + + // Open the group + strcpy(buffer, path); + if (buffer[strlen(buffer)-1] == '/') buffer[strlen(buffer)-1] = '\0'; + cb(file, buffer, WST_OPENGROUP); + + for (i = package->files; *i; ++i) + { + const char* source = (*i); + + // For each file in the target directory... + if (strlen(source) > strlen(path) && strncmp(source, path, strlen(path)) == 0) + { + // Look for a subdirectory... + const char* ptr = strchr(source + strlen(path), '/'); + if (ptr != NULL) + { + // Have I processed this subdirectory already? + const char** j; + strncpy(buffer, source, ptr - source + 1); + buffer[ptr - source + 1] = '\0'; + for (j = package->files; *j; ++j) + { + if (strncmp(buffer, *j, strlen(buffer)) == 0) + break; + } + + if (i == j) + { + char* newpath = (char*)malloc(strlen(buffer) + 1); + strcpy(newpath, buffer); + walkSourceList(file, package, newpath, cb); + free(newpath); + } + } + } + } + + // Send the source files + for (i = package->files; *i; ++i) + { + const char* source = (*i); + const char* ptr = strrchr(source, '/'); + if (strncmp(path, source, strlen(path)) == 0 && ptr <= source + strlen(path)) + cb(file, source, WST_SOURCEFILE); + } + + // Close the group + strcpy(buffer, path); + if (buffer[strlen(buffer)-1] == '/') buffer[strlen(buffer)-1] = '\0'; + cb(file, buffer, WST_CLOSEGROUP); +} + +//----------------------------------------------------------------------------- + +void writeList(FILE* file, const char** list, const char* prefix, const char* postfix, const char* infix, const char* (*check)(const char*,void*), void* data) +{ + int i = 0; + while (*list) + { + const char* value = (check != NULL) ? check(*list, data) : *list; + if (value != NULL) + { + if (i++ > 0) fprintf(file, infix); + fprintf(file, "%s%s%s", prefix, value, postfix); + } + ++list; + } +} + +//----------------------------------------------------------------------------- + +const char* getCwd() +{ + plat_getcwd(buffer, 4096); + return buffer; +} + +int setCwd(const char* path) +{ + return plat_chdir(path); +} + +//----------------------------------------------------------------------------- + +int dirOpen(const char* base, const char* mask) +{ + strcpy(buffer, base); + strcat(buffer, "/"); + strcat(buffer, mask); + return plat_dirOpen(translatePath(buffer, NATIVE)); +} + +void dirClose() +{ + plat_dirClose(); +} + +int dirGetNext() +{ + return plat_dirGetNext(); +} + +const char* dirGetName() +{ + return plat_dirGetName(); +} + +int dirIsFile() +{ + return plat_dirIsFile(); +} diff --git a/build/premake/src/Src/util.h b/build/premake/src/Src/util.h new file mode 100644 index 0000000000..7cb737584d --- /dev/null +++ b/build/premake/src/Src/util.h @@ -0,0 +1,51 @@ +//----------------------------------------------------------------------------- +// Premake - util.h +// +// Premake utility functions +// +// Copyright (C) 2002-2003 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: util.h,v 1.13 2004/03/27 13:42:24 jason379 Exp $ +//----------------------------------------------------------------------------- + +static char* CPP_EXT[] = { ".cc", ".cpp", ".cxx", ".c", NULL }; + +enum { UNIX, WIN32, NATIVE }; +extern char nativePathSep; +extern const char* osIdent; + +enum { WST_OPENGROUP, WST_CLOSEGROUP, WST_SOURCEFILE }; + +extern char** args; + +extern int copyFile(const char* src, const char* dest); +extern void deleteDirectory(const char* path, const char* name); +extern void deleteFile(const char* path, const char* name, const char* extension); +extern int endsWith(const char* haystack, const char* needle); +extern int fileExists(const char* path, const char* name, const char* extension); +extern const char* findSharedLib(const char* lib); +extern void generateUUID(char* uuid); +extern const char* getDirectory(const char* path); +extern const char* getExtension(const char* path); +extern const char* getFilename(const char* path, int trim); +extern int hasOption(char* option); +extern int inArray(const char** list, const char* value); +extern void insertPath(FILE* file, const char* path, int type); +extern int isCppFile(const char* file); +extern const char* makeAbsolute(const char* base, const char* path); +extern FILE* openFile(const char* path, const char* name, const char* extension); +extern const char* replaceChars(const char* str, const char* replace); +extern const char* replaceExtension(const char* path, const char* extension); +extern const char* reversePath(const char* path, const char* subdir, int type); +extern const char* translatePath(const char* buffer, int type); +extern void walkSourceList(FILE* file, Package* package, const char* path, void (*cb)(FILE*, const char*, int)); +extern void writeList(FILE* file, const char** list, const char* prefix, const char* postfix, const char* infix, const char* (*check)(const char*,void*), void* data); +extern const char* getCwd(); +extern int setCwd(const char* path); + +extern int dirOpen(const char* base, const char* mask); +extern void dirClose(); +extern int dirGetNext(); +extern const char* dirGetName(); +extern int dirIsFile(); diff --git a/build/premake/src/Src/vs6.c b/build/premake/src/Src/vs6.c new file mode 100644 index 0000000000..e5112025cb --- /dev/null +++ b/build/premake/src/Src/vs6.c @@ -0,0 +1,614 @@ +//----------------------------------------------------------------------------- +// Premake - vs6.c +// +// MS Visual Studio 6 tool target. +// +// Copyright (C) 2002-2004 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: vs6.c,v 1.20 2004/05/07 00:12:29 jason379 Exp $ +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "project.h" +#include "util.h" + +extern const char* dotnet; + +static int writeWorkspace(); +static int writeCsProject(Package* package); +static int writeVcProject(Package* package); +static int writeProjectHeader(FILE* file, Package* package); + +#if VS6_DOTNET +static char* csc; +#endif + +//----------------------------------------------------------------------------- + +int makeVs6Scripts() +{ + int i, csharp = 0; + + puts("Generating Visual Studio 6 workspace and project files:"); + +#if VS6_DOTNET + if (dotnet == NULL) + csc = "csc.exe"; + else if (strcmp(dotnet, "mono") == 0) + csc = "mcs.exe"; + else if (strcmp(dotnet, "pnet") == 0) + csc = "cscc.exe"; + else + csc = "csc.exe"; +#endif + + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + const char* language = package->language; + printf("...%s\n", package->name); + + if (strcmp(language, "c++") == 0 || strcmp(language, "c") == 0) + { + writeVcProject(package); + } + else if (strcmp(language, "c#") == 0) + { +#if VS6_DOTNET + csharp = 1; + writeCsProject(package); +#else + printf("** Error: C# projects are not supported by Visual Studio 6\n"); + return 0; +#endif + } + else + { + printf("** Error: unrecognized language '%s'\n", language); + return 0; + } + } + +#if VS6_DOTNET + if (csharp && getenv("DOTNET_PATH") == NULL) + { + printf("\nBEFORE USING THESE PROJECT FILES you must set the environment variable\n"); + printf("DOTNET_PATH to the directory containing %s.\n\n", csc); + + if (strcmp(csc, "csc.exe") == 0) + printf("This will be something like C:\\WinNT\\Microsoft.NET\\Framework\\v1.0.3705.\n\n"); + } +#endif + + return writeWorkspace(); +} + +//----------------------------------------------------------------------------- + +static int writeWorkspace() +{ + int i, j, k; + + FILE* file = openFile(project->path, project->name, ".dsw"); + if (file == NULL) + return 0; + + fprintf(file, "Microsoft Developer Studio Workspace File, Format Version 6.00\n"); + fprintf(file, "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\n"); + fprintf(file, "\n"); + + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + + fprintf(file, "###############################################################################\n"); + fprintf(file, "\n"); + fprintf(file, "Project: \"%s\"=%s%s.dsp\n", replaceChars(package->name,"-"), reversePath(project->path,package->path,WIN32), package->name); + fprintf(file, "\n"); + fprintf(file, "Package=<5>\n"); + fprintf(file, "{{{\n"); + fprintf(file, "}}}\n"); + fprintf(file, "\n"); + fprintf(file, "Package=<4>\n"); + fprintf(file, "{{{\n"); + + // List package dependencies on sibling projects + for (j = 0; j < package->config[0]->numLinks; ++j) + { + const char* link = package->config[0]->links[j]; + for (k = 0; k < project->numPackages; k++) + { + if (strcmp(project->package[k]->name, link) == 0) + { + fprintf(file, " Begin Project Dependency\n"); + fprintf(file, " Project_Dep_Name %s\n", replaceChars(link, "-")); + fprintf(file, " End Project Dependency\n"); + } + } + } + + fprintf(file, "}}}\n"); + fprintf(file, "\n"); + } + + fprintf(file, "###############################################################################\n"); + fprintf(file, "\n"); + fprintf(file, "Global:\n"); + fprintf(file, "\n"); + fprintf(file, "Package=<5>\n"); + fprintf(file, "{{{\n"); + fprintf(file, "}}}\n"); + fprintf(file, "\n"); + fprintf(file, "Package=<3>\n"); + fprintf(file, "{{{\n"); + fprintf(file, "}}}\n"); + fprintf(file, "\n"); + fprintf(file, "###############################################################################\n"); + fprintf(file, "\n"); + + fclose(file); + return 1; +} + +//----------------------------------------------------------------------------- + +static void vcFiles(FILE* file, const char* path, int stage) +{ + const char* ptr = strrchr(path, '/'); + int i,j; + ptr = (ptr == NULL) ? path : ptr + 1; + + switch (stage) + { + case WST_OPENGROUP: + if (strlen(path) > 0 && strcmp(ptr, "..") != 0) { + fprintf(file, "# Begin Group \"%s\"\n\n", ptr); + fprintf(file, "# PROP Default_Filter \"\"\n"); + } + break; + case WST_CLOSEGROUP: + if (strlen(path) > 0 && strcmp(ptr, "..") != 0) + fprintf(file, "# End Group\n"); + break; + case WST_SOURCEFILE: + fprintf(file, "# Begin Source File\n\n"); + fprintf(file, "SOURCE=.\\%s\n", translatePath(path,WIN32)); + for (i=0;inumPackages;i++) + { + Package *package=project->package[i]; + for (j=0;jnumConfigs;j++) + { + Config *config=package->config[j]; + + fprintf(file, "!%s \"$(CFG)\" == \"%s - Win32 %s\"\n", (i == 0 ? "IF" : "ELSEIF"), replaceChars(package->name,"-"), config->name); + fprintf(file, "\n"); + + if (config->pchSource && strcmp(ptr, config->pchSource)==0) + { + fprintf(file, "# ADD CPP /Yc\"%s\"\n", config->pchHeader); + } + } + fprintf(file, "!ENDIF\n"); + } + fprintf(file, "# End Source File\n"); + break; + } +} + +static const char* checkLink(const char* path, void* data) +{ + Package* package = getPackage(path); + if (package == NULL) return path; + + if (strcmp(package->language, "c++") == 0) + return package->config[*((int*)data)]->target; + + return NULL; +} + +static int writeVcProject(Package* package) +{ + const char* ldflags; + const char* extension; + const char* outdir; + FILE* file; + int i; + + // Some target type specific info... + if (strcmp(package->kind, "winexe") == 0) + { + ldflags = "/subsystem:windows"; + extension = "exe"; + outdir = project->binaries; + } + else if (strcmp(package->kind, "exe") == 0) + { + ldflags = "/subsystem:console"; + extension = "exe"; + outdir = project->binaries; + } + else if (strcmp(package->kind, "dll") == 0) + { + ldflags = "/dll"; + extension = "dll"; + outdir = project->binaries; + } + else if (strcmp(package->kind, "lib") == 0) + { + ldflags = + extension = "lib"; + outdir = project->libraries; + } + else + { + printf("** Error: unknown package type '%s'\n", package->kind); + return 0; + } + + // Open the file and write the header + file = openFile(package->path, package->name, ".dsp"); + if (file == NULL) + return 0; + writeProjectHeader(file, package); + + fprintf(file, "CPP=cl.exe\n"); + fprintf(file, "MTL=midl.exe\n"); + fprintf(file, "RSC=rc.exe\n"); + fprintf(file, "\n"); + + for (i = 0; i < package->numConfigs; ++i) + { + char* runtime; + + Config* config = package->config[i]; + + int size = inArray(config->buildFlags, "optimize-size"); + int speed = inArray(config->buildFlags, "optimize-speed") || inArray(config->buildFlags, "optimize"); + int debug = !size && !speed; + int importlib = !inArray(config->buildFlags, "no-import-lib"); + int noMain = inArray(config->buildFlags, "no-main"); + int exceptions = !inArray(config->buildFlags, "no-exceptions"); + + int rtti = !inArray(config->buildFlags, "no-rtti"); + + if (inArray(config->linkFlags, "static-runtime") || inArray(config->buildFlags, "static-runtime")) + runtime = (debug) ? "/MTd" : "/MT"; + else + runtime = (debug) ? "/MDd" : "/MD"; + + fprintf(file, "!%s \"$(CFG)\" == \"%s - Win32 %s\"\n", (i == 0 ? "IF" : "ELSEIF"), replaceChars(package->name,"-"), config->name); + fprintf(file, "\n"); + fprintf(file, "# PROP BASE Use_MFC 0\n"); + fprintf(file, "# PROP BASE Use_Debug_Libraries %d\n", debug ? 1 : 0); + fprintf(file, "# PROP BASE Output_Dir \"%s\\\"\n", debug ? "Debug" : "Release"); + fprintf(file, "# PROP BASE Intermediate_Dir \"%s\\\"\n", debug ? "Debug" : "Release"); + fprintf(file, "# PROP BASE Target_Dir \"\"\n"); + fprintf(file, "# PROP Use_MFC 0\n"); + fprintf(file, "# PROP Use_Debug_Libraries %d\n", debug ? 1 : 0); + fprintf(file, "# PROP Output_Dir \""); + fprintf(file, reversePath(package->path, outdir, WIN32)); + insertPath(file, getDirectory(config->target), WIN32); + fprintf(file, "\"\n"); + fprintf(file, "# PROP Intermediate_Dir \"obj\\%s\\\"\n", config->name); + if (strcmp(package->kind, "lib") != 0) + fprintf(file, "# PROP Ignore_Export_Lib %d\n", importlib ? 0 : 1); + fprintf(file, "# PROP Target_Dir \"\"\n"); + + fprintf(file, "# ADD BASE CPP /nologo /W3"); + if (debug) + fprintf(file, " /Gm /GX /ZI /Od /D \"_DEBUG\" /YX /FD /GZ /c\n"); + else + fprintf(file, " /GX /O2 /D \"NDEBUG\" /YX /FD /c\n"); + + fprintf(file, "# ADD CPP /nologo %s /W3", runtime); + if (debug) fprintf(file, " /Gm /ZI /Od"); + + if (exceptions) fprintf(file, " /GX"); + + if (rtti) fprintf(file, " /GR"); + + if (size) fprintf(file, " /O1"); + if (speed) fprintf(file, " /O2"); + writeList(file, config->defines, " /D \"", "\"", "", NULL, NULL); + writeList(file, config->includePaths, " /I \"", "\"", "", NULL, NULL); + writeList(file, config->buildOptions, "", "", " ", NULL, NULL); + + if (config->pchHeader) + fprintf(file, " /Yu\"%s\"", config->pchHeader); + else + fprintf(file, " /YX"); + + if (debug) + fprintf(file, " /FD /GZ /c\n"); + else + fprintf(file, " /FD /c\n"); + + if (strcmp(package->kind, "lib") != 0) + { + fprintf(file, "# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n"); + fprintf(file, "# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\n"); + } + + fprintf(file, "# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n"); + fprintf(file, "# ADD RSC /l 0x409 /d \"NDEBUG\"\n"); + fprintf(file, "BSC32=bscmake.exe\n"); + fprintf(file, "# ADD BASE BSC32 /nologo\n"); + fprintf(file, "# ADD BSC32 /nologo\n"); + + if (strcmp(package->kind, "lib") != 0) + { + fprintf(file, "LINK32=link.exe\n"); + fprintf(file, "# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo %s /machine:I386 %s\n", + ldflags, debug ? "/debug /pdbtype:sept" : ""); + + fprintf(file, "# ADD LINK32"); + writeList(file, config->links, " ", ".lib", "", checkLink, &i); + fprintf(file, " /nologo %s", ldflags); + if (strcmp(package->kind, "winexe") == 0 && !noMain) + fprintf(file, " /entry:\"mainCRTStartup\""); + fprintf(file, " /out:\"%s", reversePath(package->path, project->binaries, WIN32)); + fprintf(file, "%s.%s\"", translatePath(config->target,WIN32), extension); + fprintf(file, " /machine:I386"); + if (strcmp(package->kind, "dll") == 0) + { + fprintf(file, " /implib:\""); + if (importlib) + fprintf(file, reversePath(package->path, project->libraries, WIN32)); + else + fprintf(file, "$(IntDir)\\"); + fprintf(file, "%s.lib\"", translatePath(config->target, WIN32)); + } + fprintf(file, " /pdbtype:sept /libpath:\"%s\"", reversePath(package->path, project->libraries, WIN32)); + if (debug) { + fprintf(file, " /pdb:\"%s", reversePath(package->path,project->binaries,WIN32)); + fprintf(file, "%s.pdb\" /debug", translatePath(config->target,WIN32)); + } + writeList(file, config->linkOptions, " ", "", "", NULL, NULL); + fprintf(file, "\n"); + } + else + { + fprintf(file, "LIB32=link.exe -lib\n"); + fprintf(file, "# ADD BASE LIB32 /nologo\n"); + fprintf(file, "# ADD LIB32 /nologo /out:\"%s", reversePath(package->path, project->libraries, WIN32)); + fprintf(file, "%s.%s\"\n", translatePath(config->target,WIN32), extension); + } + } + + fprintf(file, "!ENDIF \n"); + fprintf(file, "\n"); + fprintf(file, "# Begin Target\n"); + fprintf(file, "\n"); + + for (i = 0; i < package->numConfigs; ++i) + fprintf(file, "# Name \"%s - Win32 %s\"\n", replaceChars(package->name,"-"), package->config[i]->name); + walkSourceList(file, package, "", vcFiles); + + fprintf(file, "# End Target\n"); + fprintf(file, "# End Project\n"); + + fclose(file); + return 1; +} + +//----------------------------------------------------------------------------- + +#if VS6_DOTNET + +static const char* checkRef(const char* path, void* data) +{ + Package* package = getPackage(path); + if (package == NULL) return path; + + if (strcmp(package->language, "c#") == 0) + return package->config[*((int*)data)]->target; + + return NULL; +} + +static int writeCsProject(Package* package) +{ + const char* extension; + FILE* file; + int i, j; + + const char* kind = package->kind; + + // .NET requires all configurations use the same assembly filespec + const char* target = package->config[0]->target; + + // Figure out the object type + if (strcmp(kind, "winexe") == 0) + { + extension = "exe"; + } + else if (strcmp(kind, "exe") == 0) + { + extension = "exe"; + } + else if (strcmp(kind, "dll") == 0) + { + extension = "dll"; + kind = "library"; + } + else + { + printf("** Error: unknown package type '%s'\n", kind); + return 0; + } + + // Open the project file and write the header + + file = openFile(package->path, package->name, ".dsp"); + if (file == NULL) return 0; + if (!writeProjectHeader(file, package)) return 0; + + fprintf(file, "MTL=midl.exe\n"); + fprintf(file, "\n"); + + for (i = 0; i < package->numConfigs; ++i) + { + Config* config = package->config[i]; + + int symbols = !inArray(config->buildFlags, "no-symbols"); + int optimize = inArray(config->buildFlags,"optimize") || inArray(config->buildFlags,"optimize-size") && inArray(config->buildFlags,"optimize-speed"); + int unsafe = inArray(config->buildFlags, "unsafe"); + + fprintf(file, "!%s \"$(CFG)\" == \"%s - Win32 %s\"\n", i == 0 ? "IF" : "ELSEIF", replaceChars(package->name,"-"), config->name); + fprintf(file, "\n"); + fprintf(file, "# PROP BASE Use_MFC 0\n"); + fprintf(file, "# PROP BASE Use_Debug_Libraries 1\n"); + fprintf(file, "# PROP BASE Output_Dir \"Release\"\n"); + fprintf(file, "# PROP BASE Intermediate_Dir \"Release\"\n"); + fprintf(file, "# PROP BASE Target_Dir \"\"\n"); + fprintf(file, "# PROP Use_MFC 0\n"); + fprintf(file, "# PROP Use_Debug_Libraries 0\n"); + fprintf(file, "# PROP Output_Dir \""); + fprintf(file, reversePath(package->path, project->binaries, WIN32)); + insertPath(file, getDirectory(config->target), WIN32); + fprintf(file, "\"\n"); + fprintf(file, "# PROP Intermediate_Dir \"obj\\%s\"\n", config->name); + fprintf(file, "# PROP Target_Dir \"\"\n"); + fprintf(file, "# Begin Special Build Tool\n"); + fprintf(file, "SOURCE=\"$(InputPath)\"\n"); + + fprintf(file, "PostBuild_Cmds=$(DOTNET_PATH)\\%s /nologo", csc); + fprintf(file, " /out:\"%s", reversePath(package->path,project->binaries,WIN32)); + fprintf(file, "\\%s.%s\"", translatePath(config->target,WIN32), extension); + fprintf(file, " /target:%s", kind); + if (symbols) fprintf(file, " /debug"); + if (optimize) fprintf(file, " /optimize"); + if (unsafe) fprintf(file, " /unsafe"); + fprintf(file, " /lib:\"%s\"", reversePath(package->path, project->binaries, WIN32)); + writeList(file, config->links, " /r:", ".dll", "", checkRef, &i); + fprintf(file, " obj\\%s\\*.cs\n", config->name); + + fprintf(file, "# End Special Build Tool\n"); + fprintf(file, "\n"); + } + + fprintf(file, "!ENDIF\n"); + fprintf(file, "\n"); + fprintf(file, "# Begin Target\n"); + fprintf(file, "\n"); + for (i = 0; i < package->numConfigs; ++i) + fprintf(file, "# Name \"%s - Win32 %s\"\n", replaceChars(package->name,"-"), package->config[i]->name); + for (i = 0; i < package->numFiles; ++i) + { + const char* source = package->files[i]; + + fprintf(file, "# Begin Source File\n"); + fprintf(file, "\n"); + fprintf(file, "SOURCE=.\\%s\n", translatePath(source, WIN32)); + fprintf(file, "\n"); + + for (j = 0; j < package->numConfigs; ++j) + { + Config* config = package->config[j]; + + fprintf(file, "!%s \"$(CFG)\" == \"%s - Win32 %s\"", (i == 0 ? "IF" : "ELSEIF"), replaceChars(package->name,"-"), config->name); + fprintf(file, "\n"); + fprintf(file, "# Begin Custom Build - %s\n", source); + fprintf(file, "IntDir=.\\obj\\%s\n", config->name); + fprintf(file, "InputPath=.\\%s\n", translatePath(source, WIN32)); + fprintf(file, "\n"); + fprintf(file, "\"$(INTDIR)\\%s\" : $(SOURCE) \"$(INTDIR)\" \"$(OUTDIR)\"\n", translatePath(source, WIN32)); + fprintf(file, "\tcopy $(InputPath) $(IntDir)\\%s > out\n", translatePath(source, WIN32)); + fprintf(file, "\terase out\n"); + fprintf(file, "\n"); + fprintf(file, "# End Custom Build\n"); + fprintf(file, "\n"); + } + + fprintf(file, "!ENDIF \n"); + fprintf(file, "\n"); + fprintf(file, "# End Source File\n"); + } + + fprintf(file, "# End Target\n"); + fprintf(file, "# End Project\n"); + fprintf(file, "\n"); + + fclose(file); + return 1; +} + +#endif + +//----------------------------------------------------------------------------- + +static int writeProjectHeader(FILE* file, Package* package) +{ + int i; + const char* tag; + const char* num; + + const char* name = replaceChars(package->name, "-"); + + if (strcmp(package->language, "c#") == 0) + { + tag = "Win32 (x86) Generic Project"; + num = "0x010a"; + } + else + { + if (strcmp(package->kind, "winexe") == 0) + { + tag = "Win32 (x86) Application"; + num = "0x0101"; + } + else if (strcmp(package->kind, "exe") == 0) + { + tag = "Win32 (x86) Console Application"; + num = "0x0103"; + } + else if (strcmp(package->kind, "dll") == 0) + { + tag = "Win32 (x86) Dynamic-Link Library"; + num = "0x0102"; + } + else if (strcmp(package->kind, "lib") == 0) + { + tag = "Win32 (x86) Static Library"; + num = "0x0104"; + } + else + { + puts("** Error: unrecognized package type"); + return 0; + } + } + + fprintf(file, "# Microsoft Developer Studio Project File - Name=\"%s\" - Package Owner=<4>\n", name); + fprintf(file, "# Microsoft Developer Studio Generated Build File, Format Version 6.00\n"); + fprintf(file, "# ** DO NOT EDIT **\n"); + fprintf(file, "\n"); + fprintf(file, "# TARGTYPE \"%s\" %s\n", tag, num); + fprintf(file, "\n"); + fprintf(file, "CFG=%s - Win32 Debug\n", name); + fprintf(file, "!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n"); + fprintf(file, "!MESSAGE use the Export Makefile command and run\n"); + fprintf(file, "!MESSAGE \n"); + fprintf(file, "!MESSAGE NMAKE /f \"%s.mak\".\n", package->name); + fprintf(file, "!MESSAGE \n"); + fprintf(file, "!MESSAGE You can specify a configuration when running NMAKE\n"); + fprintf(file, "!MESSAGE by defining the macro CFG on the command line. For example:\n"); + fprintf(file, "!MESSAGE \n"); + fprintf(file, "!MESSAGE NMAKE /f \"%s.mak\" CFG=\"%s - Win32 Debug\"\n", package->name, name); + fprintf(file, "!MESSAGE \n"); + fprintf(file, "!MESSAGE Possible choices for configuration are:\n"); + fprintf(file, "!MESSAGE \n"); + for (i = 0; i < package->numConfigs; ++i) + fprintf(file, "!MESSAGE \"%s - Win32 %s\" (based on \"%s\")\n", name, package->config[i]->name, tag); + fprintf(file, "!MESSAGE \n"); + fprintf(file, "\n"); + fprintf(file, "# Begin Project\n"); + fprintf(file, "# PROP AllowPerConfigDependencies 0\n"); + fprintf(file, "# PROP Scc_ProjName \"\"\n"); + fprintf(file, "# PROP Scc_LocalPath \"\"\n"); + + return 1; +} diff --git a/build/premake/src/Src/vs7.c b/build/premake/src/Src/vs7.c new file mode 100644 index 0000000000..f1e60826ee --- /dev/null +++ b/build/premake/src/Src/vs7.c @@ -0,0 +1,897 @@ +//----------------------------------------------------------------------------- +// Premake - vs_xml.c +// +// MS Visual Studio XML projects files (v7.0-2003) +// +// Copyright (C) 2002-2004 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: vs7.c,v 1.34 2004/05/11 00:38:58 jason379 Exp $ +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "project.h" +#include "util.h" + +typedef struct _PkgData +{ + char projGuid[38]; + char toolGuid[38]; + char projExt[8]; + char projType[8]; +} PkgData; + +static char buffer[4096]; + +static int writeSolution(int version); +static int writeVcProject(int version, Package* package); +static int writeCsProject(int version, Package* package); + +//----------------------------------------------------------------------------- + +int makeVsXmlScripts(int version) +{ + int i; + printf("Generating Visual Studio %d solution and project files:\n", version); + + // Assign UUIDs to all packages + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + PkgData* data = (PkgData*)malloc(sizeof(PkgData)); + package->data = data; + generateUUID(data->projGuid); + if (strcmp(package->language, "c++") == 0 || strcmp(package->language, "c") == 0) + { + strcpy(data->toolGuid, "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942"); + } + else if (strcmp(package->language, "c#") == 0) + { + strcpy(data->toolGuid, "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC"); + } + else + { + printf("** Error: unrecognized language '%s'\n", package->language); + return 0; + } + } + + // Generate the project files + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + PkgData* data = (PkgData*)package->data; + + printf("...%s\n", package->name); + + if (strcmp(package->language, "c++") == 0 || strcmp(package->language, "c") == 0) + { + strcpy(data->projExt, "vcproj"); + strcpy(data->projType, "Win32"); + if (!writeVcProject(version, package)) + return 0; + } + + else if (strcmp(package->language, "c#") == 0) + { + strcpy(data->projExt, "csproj"); + strcpy(data->projType, ".NET"); + if (!writeCsProject(version, package)) + return 0; + } + } + + if (!writeSolution(version)) + return 0; + + return 1; +} + +//----------------------------------------------------------------------------- + +static int numDeps = 0; /* Use by the project dependency writer */ + +/* Look for a package with the same name as 'name' and if found, return a + * dependency description to be included in the solution file */ +static const char* checkProjectDependencies(const char* name, void* data) +{ + int i; + int version = (int)data; + for (i = 0; i < project->numPackages; ++i) + { + if (strcmp(project->package[i]->name, name) == 0) + { + PkgData* data = (PkgData*)project->package[i]->data; + if (version == 7) + { + sprintf(buffer, "%d = {%s}", numDeps++, data->projGuid); + } + else + { + sprintf(buffer, "{%s} = {%s}", data->projGuid, data->projGuid); + } + return buffer; + } + } + return NULL; +} + +static int writeSolution(int version) +{ + int i, j; + FILE* file; + + file = openFile(project->path, project->name, ".sln"); + if (file == NULL) + return 0; + + /* Line 1: Format identification string */ + fprintf(file, "Microsoft Visual Studio Solution File, Format Version "); + switch (version) + { + case 7: + fprintf(file, "7.00\n"); + break; + case 2003: + fprintf(file, "8.00\n"); + break; + } + + /* List of projects that make up the solution */ + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + PkgData* data = package->data; + const char* name = package->name; + const char* path = reversePath(project->path, package->path, WIN32); + + /* VS.NET doesn't write out the leading '.\' on solution-relative + * paths. Not really necessary, but I'm trying to match the original */ + if (strncmp(path, ".\\", 2) == 0) + path = path + 2; + + fprintf(file, "Project(\"{%s}\") = \"%s\", \"%s%s.%s\", \"{%s}\"\n", data->toolGuid, name, path, name, data->projExt, data->projGuid); + if (version == 2003) + { + fprintf(file, "\tProjectSection(ProjectDependencies) = postProject\n"); + writeList(file, package->config[0]->links, "\t\t", "\n", "", checkProjectDependencies, (void*)version); + fprintf(file, "\tEndProjectSection\n"); + } + fprintf(file, "EndProject\n"); + } + + fprintf(file, "Global\n"); + fprintf(file, "\tGlobalSection(SolutionConfiguration) = preSolution\n"); + for (i = 0; i < project->package[0]->numConfigs; ++i) + { + if (version == 7) + { + fprintf(file, "\t\tConfigName.%d = %s\n", i, project->package[0]->config[i]->name); + } + else + { + fprintf(file, "\t\t%s = %s\n", project->package[0]->config[i]->name, project->package[0]->config[i]->name); + } + } + fprintf(file, "\tEndGlobalSection\n"); + + /* Find package dependencies for VS7 */ + if (version == 7) + { + fprintf(file, "\tGlobalSection(ProjectDependencies) = postSolution\n"); + for (i = 0; i < project->numPackages; ++i) + { + char prefix[128]; + Package* package = project->package[i]; + PkgData* data = (PkgData*)package->data; + Config* config = package->config[0]; + + numDeps = 0; + sprintf(prefix, "\t\t{%s}.", data->projGuid); + writeList(file, config->links, prefix, "\n", "", checkProjectDependencies, (void*)version); + } + fprintf(file, "\tEndGlobalSection\n"); + } + + // Write configuration for each project + fprintf(file, "\tGlobalSection(ProjectConfiguration) = postSolution\n"); + for (i = 0; i < project->numPackages; ++i) + { + Package* package = project->package[i]; + for (j = 0; j < package->numConfigs; ++j) + { + Config* config = package->config[j]; + PkgData* data = (PkgData*)package->data; + fprintf(file, "\t\t{%s}.%s.ActiveCfg = %s|%s\n", data->projGuid, config->name, config->name, data->projType); + fprintf(file, "\t\t{%s}.%s.Build.0 = %s|%s\n", data->projGuid, config->name, config->name, data->projType); + } + } + fprintf(file, "\tEndGlobalSection\n"); + + // Finish + + fprintf(file, "\tGlobalSection(ExtensibilityGlobals) = postSolution\n"); + fprintf(file, "\tEndGlobalSection\n"); + fprintf(file, "\tGlobalSection(ExtensibilityAddIns) = postSolution\n"); + fprintf(file, "\tEndGlobalSection\n"); + fprintf(file, "EndGlobal\n"); + + fclose(file); + return 1; +} + +//----------------------------------------------------------------------------- + +static const char* checkDir(const char* path, void* data) +{ + return translatePath(path, WIN32); +} + +static const char* checkLibs(const char* file, void* data) +{ + Package* package = getPackage(file); + if (package == NULL) return file; + if (strcmp(package->language, "c++") != 0) return NULL; + return package->config[*((int*)data)]->target; +} + +static void vcFiles(FILE* file, const char* path, int stage) +{ + char indent[128]; + char* ptr; + int i=0, j=0; + + strcpy(indent, " "); + if (strlen(path) > 0) strcat(indent, " "); + ptr = strchr(path, '/'); + while (ptr != NULL) { + strcat(indent, " "); + ptr = strchr(ptr + 1, '/'); + } + + ptr = strrchr(path, '/'); + ptr = (ptr == NULL) ? (char*)path : ptr + 1; + + switch (stage) + { + case WST_OPENGROUP: + if (strlen(path) > 0 && strcmp(ptr, "..") != 0) + { + fprintf(file, "%s\n", indent); + } + break; + + case WST_CLOSEGROUP: + if (strlen(path) > 0 && strcmp(ptr, "..") != 0) + fprintf(file, "%s\n", indent); + break; + + case WST_SOURCEFILE: + fprintf(file, "%s\n", indent, translatePath(path, WIN32)); + for (i=0;inumPackages;i++) + { + Package *package=project->package[i]; + for (j=0;jnumConfigs;j++) + { + Config *config=package->config[j]; + + if (config->pchSource && strcmp(ptr, config->pchSource)==0) + { + fprintf(file, "%s \n", indent, config->name); + fprintf(file, "%s \n", indent); + fprintf(file, "%s ", indent); + } + } + } + fprintf(file, "%s\n", indent); + break; + } +} + +static int writeVcProject(int version, Package* package) +{ + int configType, subsystem, managed, i; + const char* extension; + FILE* file; + + const char* name = package->name; + const char* path = package->path; + const char* kind = package->kind; + PkgData* data = (PkgData*)package->data; + + // Set up target type information + + if (strcmp(kind, "winexe") == 0 || strcmp(kind, "exe") == 0) + { + configType = 1; + extension = "exe"; + } + else if (strcmp(kind, "dll") == 0) + { + configType = 2; + extension = "dll"; + } + else if (strcmp(kind, "lib") == 0) + { + configType = 4; + extension = "lib"; + } + else if (strcmp(kind, "aspnet") == 0) + { + puts("** Error: C++ ASP.NET projects are not supported"); + return 0; + } + else + { + printf("** Error: unknown package kind '%s'\n", kind); + return 0; + } + + // Check the build subsystem...must be the same for all configs + + subsystem = (strcmp(kind, "exe") == 0) ? 1 : 2; + managed = inArray(package->config[0]->buildFlags, "managed"); + + // Open the file and write the header + + file = openFile(path, name, ".vcproj"); + if (file == NULL) + return 0; + + fprintf(file, "\n"); + fprintf(file, "projGuid); + fprintf(file, " Keyword=\"%s\">\n", managed ? "ManagedCProj" : "Win32Proj"); + fprintf(file, " \n"); + fprintf(file, " \n"); + fprintf(file, " \n"); + + // Write configurations + + fprintf(file, " \n"); + for (i = 0; i < package->numConfigs; ++i) + { + int optLevel, debug, symbols, runtime, noMain; + Config* config = package->config[i]; + + int optimize = inArray(config->buildFlags, "optimize"); + int size = inArray(config->buildFlags, "optimize-size"); + int speed = inArray(config->buildFlags, "optimize-speed"); + + int check64bit = !inArray(config->buildFlags, "no-64bit-checks"); + int importlib = !inArray(config->buildFlags, "no-import-lib"); + int exceptions = !inArray(config->buildFlags, "no-exceptions"); + int rtti = !inArray(config->buildFlags, "no-rtti"); + int rtc = !inArray(config->buildFlags, "no-runtime-checks"); + + if (speed) + optLevel = 2; + else if (size) + optLevel = 1; + else if (optimize) + optLevel = 3; + else + optLevel = 0; + debug = (optLevel == 0); + + if (!inArray(config->buildFlags, "no-symbols")) + symbols = (managed || inArray(config->buildFlags, "no-edit-and-continue")) ? 3 : 4; + else + symbols = 0; + + if (inArray(config->linkFlags, "static-runtime") || inArray(config->buildFlags, "static-runtime")) + runtime = (debug) ? 1 : 0; + else + runtime = (debug) ? 3 : 2; + + noMain = inArray(config->buildFlags, "no-main"); + + fprintf(file, " name); + fprintf(file, " OutputDirectory=\""); + fprintf(file, reversePath(path, (configType != 4 ? project->binaries : project->libraries), WIN32)); + insertPath(file, getDirectory(config->target), WIN32); + fprintf(file, "\"\n"); + fprintf(file, " IntermediateDirectory=\"obj\\%s\\\"\n", config->name); + fprintf(file, " ConfigurationType=\"%d\"\n", configType); + fprintf(file, " CharacterSet=\"2\""); + if (managed) fprintf(file, "\n ManagedExtensions=\"TRUE\""); + fprintf(file, ">\n"); + + fprintf(file, " buildOptions, "", "", " ", NULL, NULL); + fprintf(file, "\"\n"); + fprintf(file, " AdditionalIncludeDirectories=\""); + writeList(file, config->includePaths, "", "", ",", checkDir, NULL); + fprintf(file, "\"\n"); + if (managed) + { + fprintf(file, " AdditionalUsingDirectories=\""); + fprintf(file, reversePath(path, project->binaries, WIN32)); + fprintf(file, "\"\n"); + } + fprintf(file, " PreprocessorDefinitions=\""); + writeList(file, config->defines, "", "", ";", NULL, NULL); + fprintf(file, "\"\n"); + fprintf(file, " MinimalRebuild=\"%s\"\n", (debug && !managed) ? "TRUE" : "FALSE"); + if (!exceptions) fprintf(file, " ExceptionHandling=\"FALSE\"\n"); + fprintf(file, " BasicRuntimeChecks=\"%d\"\n", (debug && !managed && rtc) ? 3 : 0); + if (!debug) fprintf(file, " StringPooling=\"TRUE\"\n"); + if (!debug) fprintf(file, " EnableFunctionLevelLinking=\"TRUE\"\n"); + fprintf(file, " RuntimeLibrary=\"%d\"\n", runtime); + if (rtti) + fprintf(file, " RuntimeTypeInfo=\"TRUE\"\n"); + + if (config->pchHeader) + { + fprintf(file, " UsePrecompiledHeader=\"3\"\n"); + fprintf(file, " PrecompiledHeaderThrough=\"%s\"\n", config->pchHeader); + } + else + fprintf(file, " UsePrecompiledHeader=\"0\"\n"); + + fprintf(file, " WarningLevel=\"3\"\n"); + if (!managed) fprintf(file, " Detect64BitPortabilityProblems=\"%s\"\n", check64bit ? "TRUE" : "FALSE"); + fprintf(file, " DebugInformationFormat=\"%d\"/>\n", symbols); + + fprintf(file, " \n"); + + if (configType != 4) + { + fprintf(file, " linkOptions, " ", "", "", NULL, NULL); + fprintf(file, "\"\n"); + fprintf(file, " AdditionalDependencies=\""); + writeList(file, config->links, "", ".lib", " ", checkLibs, &i); + fprintf(file, "\"\n"); + fprintf(file, " OutputFile=\"$(OutDir)\\%s.%s\"\n", getFilename(config->target, 0), extension); + fprintf(file, " LinkIncremental=\"%d\"\n", debug ? 2 : 1); + fprintf(file, " AdditionalLibraryDirectories=\""); + fprintf(file, reversePath(path, project->libraries, WIN32)); + writeList(file, config->libPaths, ";", "", "", checkDir, NULL); + fprintf(file, "\"\n"); + fprintf(file, " GenerateDebugInformation=\"%s\"\n", symbols ? "TRUE" : "FALSE"); + if (symbols) fprintf(file, " ProgramDatabaseFile=\"obj\\%s\\%s.pdb\"\n", config->name, getFilename(config->target, 0)); + fprintf(file, " SubSystem=\"%d\"\n", subsystem); + if (!debug) fprintf(file, " OptimizeReferences=\"2\"\n"); + if (!debug) fprintf(file, " EnableCOMDATFolding=\"2\"\n"); + if ((strcmp(kind, "winexe") == 0 || strcmp(kind, "exe") == 0) && !noMain) + fprintf(file, " EntryPointSymbol=\"mainCRTStartup\"\n"); + else if (strcmp(kind, "dll") == 0) { + fprintf(file, " ImportLibrary=\""); + if (importlib) + fprintf(file, reversePath(path, project->libraries, WIN32)); + else + fprintf(file, "$(IntDir)"); + fprintf(file, "%s.lib\"\n", getFilename(config->target, 1)); + } + fprintf(file, " TargetMachine=\"1\"/>\n"); + } + else + { + fprintf(file, " \n", config->target); + } + + fprintf(file, " \n"); + + fprintf(file, " \n"); + + fprintf(file, " \n"); + + fprintf(file, " \n"); + + fprintf(file, " \n"); + + fprintf(file, " \n"); + + fprintf(file, " \n"); + fprintf(file, " \n"); + } + + fprintf(file, " \n"); + + fprintf(file, " \n"); + walkSourceList(file, package, "", vcFiles); + fprintf(file, " \n"); + + fprintf(file, " \n"); + fprintf(file, " \n"); + fprintf(file, "\n"); + + fclose(file); + return 1; +} + +//----------------------------------------------------------------------------- + +static const char* checkRefs(const char* ref, void* data) +{ + int i; + char* comma; + char tmp[1024]; + + // Pull the name out of the full reference + strcpy(tmp, ref); + comma = strchr(tmp, ','); + if (comma != NULL) + *comma = '\0'; + + // Write the reference name + strcpy(buffer, " Name = \""); + strcat(buffer, tmp); + strcat(buffer, "\"\n"); + + // Is this a sibling project? + for (i = 0; i < project->numPackages; ++i) + { + if (strcmp(project->package[i]->name, ref) == 0) + { + PkgData* data = (PkgData*)project->package[i]->data; + strcat(buffer, " Project = \"{"); + strcat(buffer, data->projGuid); + strcat(buffer, "}\"\n"); + strcat(buffer, " Package = \"{"); + strcat(buffer, data->toolGuid); + strcat(buffer, "}\"\n"); + return buffer; + } + } + + strcat(buffer, " AssemblyName = \""); + strcat(buffer, getFilename(tmp, 0)); + strcat(buffer, "\"\n"); + if (strlen(tmp) != strlen(getFilename(tmp, 0))) { + strcat(buffer, " HintPath = \""); + strcat(buffer, tmp); + strcat(buffer, ".dll\"\n"); + } + + // Tack on any extra information about the assembly + while (comma != NULL) + { + char* start; + for (start = comma + 1; *start == ' '; ++start); + comma = strchr(start, '='); + *comma = '\0'; + strcat(buffer, " "); + strcat(buffer, start); + strcat(buffer, " = \""); + + start = comma + 1; + comma = strchr(start, ','); + if (comma != NULL) *comma = '\0'; + strcat(buffer, start); + strcat(buffer, "\"\n"); + } + + return buffer; +} + +static const char* checkRefPaths(const char* ref, void* data) +{ + const char* projPath = (const char*)data; + return makeAbsolute(projPath, ref); +} + +static const char* checkSrcFileType(const char* file, void* data) +{ + Package* package = (Package*)data; + + strcpy(buffer, translatePath(file, WIN32)); + strcat(buffer, "\"\n"); + + if (endsWith(file, ".aspx.cs") || endsWith(file, ".asax.cs")) + { + /* The path to the parent .aspx file is relative to the .cs file. + * I assume that they are in the same directory and strip off all + * path information, then cut off the '.cs' */ + char* ptr = strrchr(file, '/'); + if (ptr == NULL) + ptr = (char*)file; + else + ptr++; + + strcat(buffer, "\t\t\t\t\tDependentUpon = \""); + strncat(buffer, ptr, strlen(ptr) - 3); + strcat(buffer, "\"\n"); + strcat(buffer, "\t\t\t\t\tSubType = \"ASPXCodeBehind\"\n"); + strcat(buffer, "\t\t\t\t\tBuildAction = \"Compile\"\n"); + } +/* obsolete, handled by ".resx" block below + else if (endsWith(file, ".aspx.resx") || endsWith(file, ".asax.resx")) + { + strcat(buffer, "\t\t\t\t\tDependentUpon = \""); + strncat(buffer, file, strlen(file) - 5); + strcat(buffer, ".cs\"\n"); + strcat(buffer, "\t\t\t\t\tBuildAction = \"EmbeddedResource\"\n"); + } +*/ + else if (endsWith(file, ".cs")) + { + strcat(buffer, "\t\t\t\t\tSubType = \"Code\"\n"); + strcat(buffer, "\t\t\t\t\tBuildAction = \"Compile\"\n"); + } + else if (endsWith(file, ".aspx")) + { + strcat(buffer, "\t\t\t\t\tSubType = \"Form\"\n"); + strcat(buffer, "\t\t\t\t\tBuildAction = \"Content\"\n"); + } + else if (endsWith(file, ".asax")) + { + strcat(buffer, "\t\t\t\t\tSubType = \"Component\"\n"); + strcat(buffer, "\t\t\t\t\tBuildAction = \"Content\"\n"); + } + else if (endsWith(file, ".resx")) + { + /* If a matching .cs file exists, link it */ + char depname[2048]; + strcpy(depname, file); + strcpy(depname + strlen(file) - 5, ".cs"); + if (inArray(package->files, depname)) + { + /* Path is relative to .resx file, I assume both are in same + * directory and cut off path information */ + char* ptr = strrchr(depname, '/'); + ptr = (ptr != NULL) ? ptr+1 : depname; + strcat(buffer, "\t\t\t\t\tDependentUpon = \""); + strcat(buffer, ptr); + strcat(buffer, "\"\n"); + } + strcat(buffer, "\t\t\t\t\tBuildAction = \"EmbeddedResource\"\n"); + } + else + { + strcat(buffer, "\t\t\t\t\tBuildAction = \""); + strcat(buffer, strcmp(package->kind, "aspnet") == 0 ? "Content" : "None"); + strcat(buffer, "\"\n"); + } + + return buffer; +} + +static int writeCsProject(int version, Package* package) +{ + FILE* file; + const char* target; + const char* outputType; + int i; + + const char* name = package->name; + const char* path = package->path; + const char* kind = package->kind; + PkgData* data = (PkgData*)package->data; + + if (strcmp(kind, "winexe") == 0) + outputType = "WinExe"; + else if (strcmp(kind, "exe") == 0) + outputType = "Exe"; + else if (strcmp(kind, "dll") == 0 || strcmp(kind, "aspnet") == 0) + outputType = "Library"; + else + { + printf("** Error: unknown package kind '%s'\n", kind); + return 0; + } + + // Open the project file and write the header + file = openFile(path, name, ".csproj"); + if (file == NULL) + return 0; + + fprintf(file, "\n"); + fprintf(file, " projGuid); + fprintf(file, " >\n"); + fprintf(file, " \n"); + fprintf(file, " config[0]->target, 0)); + fprintf(file, " AssemblyOriginatorKeyFile = \"\"\n"); + fprintf(file, " DefaultClientScript = \"JScript\"\n"); + fprintf(file, " DefaultHTMLPageLayout = \"Grid\"\n"); + fprintf(file, " DefaultTargetSchema = \"IE50\"\n"); + fprintf(file, " DelaySign = \"false\"\n"); + if (version == 7) + { + fprintf(file, " NoStandardLibraries = \"false\"\n"); + } + fprintf(file, " OutputType = \"%s\"\n", outputType); + if (version == 2003) + { + fprintf(file, " PreBuildEvent = \"\"\n"); + fprintf(file, " PostBuildEvent = \"\"\n"); + } + fprintf(file, " RootNamespace = \"%s\"\n", getFilename(package->config[0]->target, 0)); + if (version == 2003) + { + fprintf(file, " RunPostBuildEvent = \"OnBuildSuccess\"\n"); + } + + fprintf(file, " StartupObject = \"\"\n"); + fprintf(file, " >\n"); + + for (i = 0; i < package->numConfigs; ++i) + { + Config* config = package->config[i]; + + int symbols = !inArray(config->buildFlags, "no-symbols"); + int optimize = inArray(config->buildFlags, "optimize") || inArray(config->buildFlags, "optimize-size") || inArray(config->buildFlags, "optimize-speed"); + int unsafe = inArray(config->buildFlags, "unsafe"); + + fprintf(file, " name); + fprintf(file, " AllowUnsafeBlocks = \"%s\"\n", unsafe ? "true" : "false"); + fprintf(file, " BaseAddress = \"285212672\"\n"); + fprintf(file, " CheckForOverflowUnderflow = \"false\"\n"); + fprintf(file, " ConfigurationOverrideFile = \"\"\n"); + fprintf(file, " DefineConstants = \""); + writeList(file, config->defines, "", "", ";", NULL, NULL); + fprintf(file, "\"\n"); + fprintf(file, " DocumentationFile = \"\"\n"); + fprintf(file, " DebugSymbols = \"%s\"\n", symbols ? "true" : "false"); + fprintf(file, " FileAlignment = \"4096\"\n"); + fprintf(file, " IncrementalBuild = \""); + fprintf(file, strcmp(kind, "aspnet") == 0 ? "false" : "true"); + fprintf(file, "\"\n"); + if (version == 2003) + { + fprintf(file, " NoStdLib = \"false\"\n"); + fprintf(file, " NoWarn = \"\"\n"); + } + fprintf(file, " Optimize = \"%s\"\n", optimize ? "true" : "false"); + + fprintf(file, " OutputPath = \""); + fprintf(file, reversePath(path, project->binaries, WIN32)); + insertPath(file, getDirectory(config->target), WIN32); + fprintf(file, "\"\n"); + + fprintf(file, " RegisterForComInterop = \"false\"\n"); + fprintf(file, " RemoveIntegerChecks = \"false\"\n"); + fprintf(file, " TreatWarningsAsErrors = \"false\"\n"); + fprintf(file, " WarningLevel = \"4\"\n"); + fprintf(file, " />\n"); + } + + fprintf(file, " \n"); + + // VS7 requires same references for all configurations + fprintf(file, " \n"); + writeList(file, package->config[0]->links, " \n", "", checkRefs, package); + fprintf(file, " \n"); + fprintf(file, " \n"); + + fprintf(file, " \n"); + fprintf(file, " \n"); + writeList(file, package->files, " \n", "", checkSrcFileType, package); + fprintf(file, " \n"); + fprintf(file, " \n"); + fprintf(file, " \n"); + fprintf(file, "\n"); + + fclose(file); + + // Now write the .csproj.user file for non-web applications or + // .csproj.webinfo for web applications + + if (strcmp(kind, "aspnet") != 0) + { + file = openFile(path, name, ".csproj.user"); + if (file == NULL) + return 0; + + fprintf(file, "\n"); + fprintf(file, " \n"); + fprintf(file, " \n"); + fprintf(file, " config[0]->libPaths, "", ";", "", checkRefPaths, (void*)path); + target = makeAbsolute(".", project->binaries); + if (target != NULL) fprintf(file, target); + fprintf(file, "\" >\n"); + + for (i = 0; i < package->numConfigs; ++i) + { + fprintf(file, " config[i]->name); + fprintf(file, " EnableASPDebugging = \"false\"\n"); + fprintf(file, " EnableASPXDebugging = \"false\"\n"); + fprintf(file, " EnableUnmanagedDebugging = \"false\"\n"); + fprintf(file, " EnableSQLServerDebugging = \"false\"\n"); + fprintf(file, " RemoteDebugEnabled = \"false\"\n"); + fprintf(file, " RemoteDebugMachine = \"\"\n"); + fprintf(file, " StartAction = \"Project\"\n"); + fprintf(file, " StartArguments = \"\"\n"); + fprintf(file, " StartPage = \"\"\n"); + fprintf(file, " StartProgram = \"\"\n"); + fprintf(file, " StartURL = \"\"\n"); + fprintf(file, " StartWorkingDirectory = \"\"\n"); + fprintf(file, " StartWithIE = \"false\"\n"); + fprintf(file, " />\n"); + } + + fprintf(file, " \n"); + fprintf(file, " \n"); + fprintf(file, " \n"); + fprintf(file, " \n"); + fprintf(file, "\n"); + + fclose(file); + } + else + { + if (package->url == NULL) + { + sprintf(buffer, "http://localhost/%s", package->name); + package->url = buffer; + } + + file = openFile(path, name, ".csproj.webinfo"); + if (file == NULL) + return 0; + + fprintf(file, "\n"); + fprintf(file, " \n", package->url, package->name); + fprintf(file, "\n"); + + fclose(file); + } + + return 1; +} diff --git a/build/premake/src/Src/windows.c b/build/premake/src/Src/windows.c new file mode 100644 index 0000000000..64057ac2a3 --- /dev/null +++ b/build/premake/src/Src/windows.c @@ -0,0 +1,169 @@ +//----------------------------------------------------------------------------- +// Premake - windows.c +// +// MS Windows file and directory manipulation functions. +// +// Copyright (C) 2002-2004 by Jason Perkins +// Source code licensed under the GPL, see LICENSE.txt for details. +// +// $Id: windows.c,v 1.10 2004/01/09 20:48:02 jason379 Exp $ +//----------------------------------------------------------------------------- + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include + +char nativePathSep = '\\'; +const char* osIdent = "windows"; + +static int (__stdcall *CoCreateGuid)(char*) = NULL; +static HANDLE hDir; +static WIN32_FIND_DATA entry; +static int first; + +//----------------------------------------------------------------------------- + +int plat_chdir(const char* path) +{ + return SetCurrentDirectory(path); +} + +//----------------------------------------------------------------------------- + +int plat_copyFile(const char* src, const char* dest) +{ + return CopyFile(src, dest, FALSE); +} + +//----------------------------------------------------------------------------- + +void plat_deleteDir(const char* path) +{ + WIN32_FIND_DATA data; + HANDLE hDir; + + char* buffer = (char*)malloc(strlen(path) + 6); + strcpy(buffer, path); + strcat(buffer, "\\*.*"); + hDir = FindFirstFile(buffer, &data); + if (hDir == INVALID_HANDLE_VALUE) + return; + free(buffer); + + do + { + if (strcmp(data.cFileName, ".") == 0) continue; + if (strcmp(data.cFileName, "..") == 0) continue; + + buffer = (char*)malloc(strlen(path) + strlen(data.cFileName) + 2); + strcpy(buffer, path); + strcat(buffer, "\\"); + strcat(buffer, data.cFileName); + + if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + plat_deleteDir(buffer); + else + DeleteFile(buffer); + + free(buffer); + } while (FindNextFile(hDir, &data)); + FindClose(hDir); + + RemoveDirectory(path); +} + +//----------------------------------------------------------------------------- + +void plat_deleteFile(const char* path) +{ + DeleteFile(path); +} + +//----------------------------------------------------------------------------- + +int plat_findLib(const char* lib, char* buffer, int size) +{ + HMODULE hLib = LoadLibrary(lib); + if (hLib != NULL) + { + char* ptr; + + GetModuleFileName(hLib, buffer, size); + for (ptr = buffer; *ptr != '\0'; ++ptr) + if (*ptr == '\\') *ptr = '/'; + + ptr = strrchr(buffer, '/'); + if (ptr) *ptr = '\0'; + + FreeLibrary(hLib); + return 1; + } + return 0; +} + +//----------------------------------------------------------------------------- + +void plat_generateUUID(char* uuid) +{ + if (CoCreateGuid == NULL) + { + HMODULE hOleDll = LoadLibrary("OLE32.DLL"); + *((void**)&CoCreateGuid) = GetProcAddress(hOleDll, "CoCreateGuid"); + } + + CoCreateGuid(uuid); +} + +//----------------------------------------------------------------------------- + +void plat_getcwd(char* buffer, int size) +{ + GetCurrentDirectory(size, buffer); +} + +//----------------------------------------------------------------------------- + +int plat_isAbsPath(const char* buffer) +{ + return (buffer[0] == '/' || buffer[0] == '\\' || buffer[1] == ':'); +} + +//----------------------------------------------------------------------------- + +int plat_dirOpen(const char* mask) +{ + hDir = FindFirstFile(mask, &entry); + first = 1; + return (hDir != INVALID_HANDLE_VALUE); +} + +void plat_dirClose() +{ + if (hDir != INVALID_HANDLE_VALUE) + FindClose(hDir); +} + +int plat_dirGetNext() +{ + if (hDir == INVALID_HANDLE_VALUE) return 0; + if (first) + { + first = !first; + return 1; + } + else + { + return FindNextFile(hDir, &entry); + } +} + +const char* plat_dirGetName() +{ + return entry.cFileName; +} + +int plat_dirIsFile() +{ + return (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0; +} diff --git a/build/premake/src/premake.lua b/build/premake/src/premake.lua new file mode 100644 index 0000000000..4cc408bf58 --- /dev/null +++ b/build/premake/src/premake.lua @@ -0,0 +1,30 @@ +project.name = "Premake" + +package.language = "c++" +package.kind = "exe" +package.target = "premake" + +package.buildflags = { "no-64bit-checks", "static-runtime" } +package.config["Release"].buildflags = { "no-symbols", "optimize-size" } + +package.files = +{ + "Src/premake.c", + "Src/project.h", + "Src/project.c", + "Src/util.h", + "Src/util.c", + "Src/clean.c", + "Src/gnu.c", + "Src/sharpdev.c", + "Src/vs7.c", + "Src/vs6.c", + matchfiles("Src/Lua/*.c", "Src/Lua/*.h") +} + +if (OS == "windows") then + tinsert(package.files, "Src/windows.c") +else + tinsert(package.files, "Src/posix.c") +end + diff --git a/source/workspaces/required-libraries-linux.txt b/build/workspaces/required-libraries-linux.txt similarity index 100% rename from source/workspaces/required-libraries-linux.txt rename to build/workspaces/required-libraries-linux.txt diff --git a/source/workspaces/required-libraries.txt b/build/workspaces/required-libraries.txt similarity index 100% rename from source/workspaces/required-libraries.txt rename to build/workspaces/required-libraries.txt diff --git a/source/workspaces/update-workspaces.bat b/build/workspaces/update-workspaces.bat similarity index 100% rename from source/workspaces/update-workspaces.bat rename to build/workspaces/update-workspaces.bat diff --git a/source/workspaces/update-workspaces.sh b/build/workspaces/update-workspaces.sh similarity index 100% rename from source/workspaces/update-workspaces.sh rename to build/workspaces/update-workspaces.sh diff --git a/source/ape/ape.dsp b/source/tools/ape/ape.dsp similarity index 100% rename from source/ape/ape.dsp rename to source/tools/ape/ape.dsp diff --git a/source/ape/ape.dsw b/source/tools/ape/ape.dsw similarity index 100% rename from source/ape/ape.dsw rename to source/tools/ape/ape.dsw diff --git a/source/ape/ext/MathUtil.h b/source/tools/ape/ext/MathUtil.h similarity index 100% rename from source/ape/ext/MathUtil.h rename to source/tools/ape/ext/MathUtil.h diff --git a/source/ape/ext/Particle.cpp b/source/tools/ape/ext/Particle.cpp similarity index 100% rename from source/ape/ext/Particle.cpp rename to source/tools/ape/ext/Particle.cpp diff --git a/source/ape/ext/Particle.h b/source/tools/ape/ext/Particle.h similarity index 100% rename from source/ape/ext/Particle.h rename to source/tools/ape/ext/Particle.h diff --git a/source/ape/ext/ParticleEmitter.cpp b/source/tools/ape/ext/ParticleEmitter.cpp similarity index 100% rename from source/ape/ext/ParticleEmitter.cpp rename to source/tools/ape/ext/ParticleEmitter.cpp diff --git a/source/ape/ext/ParticleEmitter.h b/source/tools/ape/ext/ParticleEmitter.h similarity index 100% rename from source/ape/ext/ParticleEmitter.h rename to source/tools/ape/ext/ParticleEmitter.h diff --git a/source/ape/ext/ParticleSystem.cpp b/source/tools/ape/ext/ParticleSystem.cpp similarity index 100% rename from source/ape/ext/ParticleSystem.cpp rename to source/tools/ape/ext/ParticleSystem.cpp diff --git a/source/ape/ext/ParticleSystem.h b/source/tools/ape/ext/ParticleSystem.h similarity index 100% rename from source/ape/ext/ParticleSystem.h rename to source/tools/ape/ext/ParticleSystem.h diff --git a/source/ape/ext/Sprite.cpp b/source/tools/ape/ext/Sprite.cpp similarity index 100% rename from source/ape/ext/Sprite.cpp rename to source/tools/ape/ext/Sprite.cpp diff --git a/source/ape/ext/Sprite.h b/source/tools/ape/ext/Sprite.h similarity index 100% rename from source/ape/ext/Sprite.h rename to source/tools/ape/ext/Sprite.h diff --git a/source/ape/ext/Types.h b/source/tools/ape/ext/Types.h similarity index 100% rename from source/ape/ext/Types.h rename to source/tools/ape/ext/Types.h diff --git a/source/ape/ext/Vector3D.cpp b/source/tools/ape/ext/Vector3D.cpp similarity index 100% rename from source/ape/ext/Vector3D.cpp rename to source/tools/ape/ext/Vector3D.cpp diff --git a/source/ape/ext/Vector3D.h b/source/tools/ape/ext/Vector3D.h similarity index 100% rename from source/ape/ext/Vector3D.h rename to source/tools/ape/ext/Vector3D.h diff --git a/source/ape/ext/tex_.cpp b/source/tools/ape/ext/tex_.cpp similarity index 100% rename from source/ape/ext/tex_.cpp rename to source/tools/ape/ext/tex_.cpp diff --git a/source/ape/ext/tex_.h b/source/tools/ape/ext/tex_.h similarity index 100% rename from source/ape/ext/tex_.h rename to source/tools/ape/ext/tex_.h diff --git a/source/ape/ext/timer_.cpp b/source/tools/ape/ext/timer_.cpp similarity index 100% rename from source/ape/ext/timer_.cpp rename to source/tools/ape/ext/timer_.cpp diff --git a/source/ape/ext/timer_.h b/source/tools/ape/ext/timer_.h similarity index 100% rename from source/ape/ext/timer_.h rename to source/tools/ape/ext/timer_.h diff --git a/source/ape/main.cpp b/source/tools/ape/main.cpp similarity index 100% rename from source/ape/main.cpp rename to source/tools/ape/main.cpp diff --git a/source/ape/readme.txt b/source/tools/ape/readme.txt similarity index 100% rename from source/ape/readme.txt rename to source/tools/ape/readme.txt diff --git a/source/sced/AlterElevationCommand.cpp b/source/tools/sced/AlterElevationCommand.cpp similarity index 100% rename from source/sced/AlterElevationCommand.cpp rename to source/tools/sced/AlterElevationCommand.cpp diff --git a/source/sced/AlterElevationCommand.h b/source/tools/sced/AlterElevationCommand.h similarity index 100% rename from source/sced/AlterElevationCommand.h rename to source/tools/sced/AlterElevationCommand.h diff --git a/source/sced/AlterLightEnvCommand.cpp b/source/tools/sced/AlterLightEnvCommand.cpp similarity index 100% rename from source/sced/AlterLightEnvCommand.cpp rename to source/tools/sced/AlterLightEnvCommand.cpp diff --git a/source/sced/AlterLightEnvCommand.h b/source/tools/sced/AlterLightEnvCommand.h similarity index 100% rename from source/sced/AlterLightEnvCommand.h rename to source/tools/sced/AlterLightEnvCommand.h diff --git a/source/sced/Array2D.h b/source/tools/sced/Array2D.h similarity index 100% rename from source/sced/Array2D.h rename to source/tools/sced/Array2D.h diff --git a/source/sced/BrushShapeEditorTool.cpp b/source/tools/sced/BrushShapeEditorTool.cpp similarity index 100% rename from source/sced/BrushShapeEditorTool.cpp rename to source/tools/sced/BrushShapeEditorTool.cpp diff --git a/source/sced/BrushShapeEditorTool.h b/source/tools/sced/BrushShapeEditorTool.h similarity index 100% rename from source/sced/BrushShapeEditorTool.h rename to source/tools/sced/BrushShapeEditorTool.h diff --git a/source/sced/BrushTool.cpp b/source/tools/sced/BrushTool.cpp similarity index 100% rename from source/sced/BrushTool.cpp rename to source/tools/sced/BrushTool.cpp diff --git a/source/sced/BrushTool.h b/source/tools/sced/BrushTool.h similarity index 100% rename from source/sced/BrushTool.h rename to source/tools/sced/BrushTool.h diff --git a/source/sced/Command.h b/source/tools/sced/Command.h similarity index 100% rename from source/sced/Command.h rename to source/tools/sced/Command.h diff --git a/source/sced/CommandManager.cpp b/source/tools/sced/CommandManager.cpp similarity index 100% rename from source/sced/CommandManager.cpp rename to source/tools/sced/CommandManager.cpp diff --git a/source/sced/CommandManager.h b/source/tools/sced/CommandManager.h similarity index 100% rename from source/sced/CommandManager.h rename to source/tools/sced/CommandManager.h diff --git a/source/sced/EditorData.cpp b/source/tools/sced/EditorData.cpp similarity index 100% rename from source/sced/EditorData.cpp rename to source/tools/sced/EditorData.cpp diff --git a/source/sced/EditorData.h b/source/tools/sced/EditorData.h similarity index 100% rename from source/sced/EditorData.h rename to source/tools/sced/EditorData.h diff --git a/source/sced/InfoBox.cpp b/source/tools/sced/InfoBox.cpp similarity index 100% rename from source/sced/InfoBox.cpp rename to source/tools/sced/InfoBox.cpp diff --git a/source/sced/InfoBox.h b/source/tools/sced/InfoBox.h similarity index 100% rename from source/sced/InfoBox.h rename to source/tools/sced/InfoBox.h diff --git a/source/sced/MiniMap.cpp b/source/tools/sced/MiniMap.cpp similarity index 100% rename from source/sced/MiniMap.cpp rename to source/tools/sced/MiniMap.cpp diff --git a/source/sced/MiniMap.h b/source/tools/sced/MiniMap.h similarity index 100% rename from source/sced/MiniMap.h rename to source/tools/sced/MiniMap.h diff --git a/source/sced/NaviCam.cpp b/source/tools/sced/NaviCam.cpp similarity index 100% rename from source/sced/NaviCam.cpp rename to source/tools/sced/NaviCam.cpp diff --git a/source/sced/NaviCam.h b/source/tools/sced/NaviCam.h similarity index 100% rename from source/sced/NaviCam.h rename to source/tools/sced/NaviCam.h diff --git a/source/sced/PaintObjectCommand.cpp b/source/tools/sced/PaintObjectCommand.cpp similarity index 100% rename from source/sced/PaintObjectCommand.cpp rename to source/tools/sced/PaintObjectCommand.cpp diff --git a/source/sced/PaintObjectCommand.h b/source/tools/sced/PaintObjectCommand.h similarity index 100% rename from source/sced/PaintObjectCommand.h rename to source/tools/sced/PaintObjectCommand.h diff --git a/source/sced/PaintObjectTool.cpp b/source/tools/sced/PaintObjectTool.cpp similarity index 100% rename from source/sced/PaintObjectTool.cpp rename to source/tools/sced/PaintObjectTool.cpp diff --git a/source/sced/PaintObjectTool.h b/source/tools/sced/PaintObjectTool.h similarity index 100% rename from source/sced/PaintObjectTool.h rename to source/tools/sced/PaintObjectTool.h diff --git a/source/sced/PaintTextureCommand.cpp b/source/tools/sced/PaintTextureCommand.cpp similarity index 100% rename from source/sced/PaintTextureCommand.cpp rename to source/tools/sced/PaintTextureCommand.cpp diff --git a/source/sced/PaintTextureCommand.h b/source/tools/sced/PaintTextureCommand.h similarity index 100% rename from source/sced/PaintTextureCommand.h rename to source/tools/sced/PaintTextureCommand.h diff --git a/source/sced/PaintTextureTool.cpp b/source/tools/sced/PaintTextureTool.cpp similarity index 100% rename from source/sced/PaintTextureTool.cpp rename to source/tools/sced/PaintTextureTool.cpp diff --git a/source/sced/PaintTextureTool.h b/source/tools/sced/PaintTextureTool.h similarity index 100% rename from source/sced/PaintTextureTool.h rename to source/tools/sced/PaintTextureTool.h diff --git a/source/sced/RaiseElevationCommand.cpp b/source/tools/sced/RaiseElevationCommand.cpp similarity index 100% rename from source/sced/RaiseElevationCommand.cpp rename to source/tools/sced/RaiseElevationCommand.cpp diff --git a/source/sced/RaiseElevationCommand.h b/source/tools/sced/RaiseElevationCommand.h similarity index 100% rename from source/sced/RaiseElevationCommand.h rename to source/tools/sced/RaiseElevationCommand.h diff --git a/source/sced/RaiseElevationTool.cpp b/source/tools/sced/RaiseElevationTool.cpp similarity index 100% rename from source/sced/RaiseElevationTool.cpp rename to source/tools/sced/RaiseElevationTool.cpp diff --git a/source/sced/RaiseElevationTool.h b/source/tools/sced/RaiseElevationTool.h similarity index 100% rename from source/sced/RaiseElevationTool.h rename to source/tools/sced/RaiseElevationTool.h diff --git a/source/sced/ScEd.clw b/source/tools/sced/ScEd.clw similarity index 100% rename from source/sced/ScEd.clw rename to source/tools/sced/ScEd.clw diff --git a/source/sced/ScEd.dep b/source/tools/sced/ScEd.dep similarity index 100% rename from source/sced/ScEd.dep rename to source/tools/sced/ScEd.dep diff --git a/source/sced/ScEd.dsp b/source/tools/sced/ScEd.dsp similarity index 100% rename from source/sced/ScEd.dsp rename to source/tools/sced/ScEd.dsp diff --git a/source/sced/ScEd.mak b/source/tools/sced/ScEd.mak similarity index 100% rename from source/sced/ScEd.mak rename to source/tools/sced/ScEd.mak diff --git a/source/sced/SelectObjectTool.cpp b/source/tools/sced/SelectObjectTool.cpp similarity index 100% rename from source/sced/SelectObjectTool.cpp rename to source/tools/sced/SelectObjectTool.cpp diff --git a/source/sced/SelectObjectTool.h b/source/tools/sced/SelectObjectTool.h similarity index 100% rename from source/sced/SelectObjectTool.h rename to source/tools/sced/SelectObjectTool.h diff --git a/source/sced/SmoothElevationCommand.cpp b/source/tools/sced/SmoothElevationCommand.cpp similarity index 100% rename from source/sced/SmoothElevationCommand.cpp rename to source/tools/sced/SmoothElevationCommand.cpp diff --git a/source/sced/SmoothElevationCommand.h b/source/tools/sced/SmoothElevationCommand.h similarity index 100% rename from source/sced/SmoothElevationCommand.h rename to source/tools/sced/SmoothElevationCommand.h diff --git a/source/sced/SmoothElevationTool.cpp b/source/tools/sced/SmoothElevationTool.cpp similarity index 100% rename from source/sced/SmoothElevationTool.cpp rename to source/tools/sced/SmoothElevationTool.cpp diff --git a/source/sced/SmoothElevationTool.h b/source/tools/sced/SmoothElevationTool.h similarity index 100% rename from source/sced/SmoothElevationTool.h rename to source/tools/sced/SmoothElevationTool.h diff --git a/source/sced/Tool.h b/source/tools/sced/Tool.h similarity index 100% rename from source/sced/Tool.h rename to source/tools/sced/Tool.h diff --git a/source/sced/ToolManager.cpp b/source/tools/sced/ToolManager.cpp similarity index 100% rename from source/sced/ToolManager.cpp rename to source/tools/sced/ToolManager.cpp diff --git a/source/sced/ToolManager.h b/source/tools/sced/ToolManager.h similarity index 100% rename from source/sced/ToolManager.h rename to source/tools/sced/ToolManager.h diff --git a/source/sced/UserConfig.cpp b/source/tools/sced/UserConfig.cpp similarity index 100% rename from source/sced/UserConfig.cpp rename to source/tools/sced/UserConfig.cpp diff --git a/source/sced/UserConfig.h b/source/tools/sced/UserConfig.h similarity index 100% rename from source/sced/UserConfig.h rename to source/tools/sced/UserConfig.h diff --git a/source/sced/ui/BrushShapeEditorDlgBar.cpp b/source/tools/sced/ui/BrushShapeEditorDlgBar.cpp similarity index 100% rename from source/sced/ui/BrushShapeEditorDlgBar.cpp rename to source/tools/sced/ui/BrushShapeEditorDlgBar.cpp diff --git a/source/sced/ui/BrushShapeEditorDlgBar.h b/source/tools/sced/ui/BrushShapeEditorDlgBar.h similarity index 100% rename from source/sced/ui/BrushShapeEditorDlgBar.h rename to source/tools/sced/ui/BrushShapeEditorDlgBar.h diff --git a/source/sced/ui/ColorButton.cpp b/source/tools/sced/ui/ColorButton.cpp similarity index 100% rename from source/sced/ui/ColorButton.cpp rename to source/tools/sced/ui/ColorButton.cpp diff --git a/source/sced/ui/ColorButton.h b/source/tools/sced/ui/ColorButton.h similarity index 100% rename from source/sced/ui/ColorButton.h rename to source/tools/sced/ui/ColorButton.h diff --git a/source/sced/ui/DirectionButton.cpp b/source/tools/sced/ui/DirectionButton.cpp similarity index 100% rename from source/sced/ui/DirectionButton.cpp rename to source/tools/sced/ui/DirectionButton.cpp diff --git a/source/sced/ui/DirectionButton.h b/source/tools/sced/ui/DirectionButton.h similarity index 100% rename from source/sced/ui/DirectionButton.h rename to source/tools/sced/ui/DirectionButton.h diff --git a/source/sced/ui/ElevToolsDlgBar.cpp b/source/tools/sced/ui/ElevToolsDlgBar.cpp similarity index 100% rename from source/sced/ui/ElevToolsDlgBar.cpp rename to source/tools/sced/ui/ElevToolsDlgBar.cpp diff --git a/source/sced/ui/ElevToolsDlgBar.h b/source/tools/sced/ui/ElevToolsDlgBar.h similarity index 100% rename from source/sced/ui/ElevToolsDlgBar.h rename to source/tools/sced/ui/ElevToolsDlgBar.h diff --git a/source/sced/ui/ElevationButton.cpp b/source/tools/sced/ui/ElevationButton.cpp similarity index 100% rename from source/sced/ui/ElevationButton.cpp rename to source/tools/sced/ui/ElevationButton.cpp diff --git a/source/sced/ui/ElevationButton.h b/source/tools/sced/ui/ElevationButton.h similarity index 100% rename from source/sced/ui/ElevationButton.h rename to source/tools/sced/ui/ElevationButton.h diff --git a/source/sced/ui/ImageListCtrl.cpp b/source/tools/sced/ui/ImageListCtrl.cpp similarity index 100% rename from source/sced/ui/ImageListCtrl.cpp rename to source/tools/sced/ui/ImageListCtrl.cpp diff --git a/source/sced/ui/ImageListCtrl.h b/source/tools/sced/ui/ImageListCtrl.h similarity index 100% rename from source/sced/ui/ImageListCtrl.h rename to source/tools/sced/ui/ImageListCtrl.h diff --git a/source/sced/ui/LightSettingsDlg.cpp b/source/tools/sced/ui/LightSettingsDlg.cpp similarity index 100% rename from source/sced/ui/LightSettingsDlg.cpp rename to source/tools/sced/ui/LightSettingsDlg.cpp diff --git a/source/sced/ui/LightSettingsDlg.h b/source/tools/sced/ui/LightSettingsDlg.h similarity index 100% rename from source/sced/ui/LightSettingsDlg.h rename to source/tools/sced/ui/LightSettingsDlg.h diff --git a/source/sced/ui/MainFrameDlgBar.cpp b/source/tools/sced/ui/MainFrameDlgBar.cpp similarity index 100% rename from source/sced/ui/MainFrameDlgBar.cpp rename to source/tools/sced/ui/MainFrameDlgBar.cpp diff --git a/source/sced/ui/MainFrameDlgBar.h b/source/tools/sced/ui/MainFrameDlgBar.h similarity index 100% rename from source/sced/ui/MainFrameDlgBar.h rename to source/tools/sced/ui/MainFrameDlgBar.h diff --git a/source/sced/ui/MainFrm.cpp b/source/tools/sced/ui/MainFrm.cpp similarity index 100% rename from source/sced/ui/MainFrm.cpp rename to source/tools/sced/ui/MainFrm.cpp diff --git a/source/sced/ui/MainFrm.h b/source/tools/sced/ui/MainFrm.h similarity index 100% rename from source/sced/ui/MainFrm.h rename to source/tools/sced/ui/MainFrm.h diff --git a/source/sced/ui/MapSizeDlg.cpp b/source/tools/sced/ui/MapSizeDlg.cpp similarity index 100% rename from source/sced/ui/MapSizeDlg.cpp rename to source/tools/sced/ui/MapSizeDlg.cpp diff --git a/source/sced/ui/MapSizeDlg.h b/source/tools/sced/ui/MapSizeDlg.h similarity index 100% rename from source/sced/ui/MapSizeDlg.h rename to source/tools/sced/ui/MapSizeDlg.h diff --git a/source/sced/ui/NavigatePropPage.cpp b/source/tools/sced/ui/NavigatePropPage.cpp similarity index 100% rename from source/sced/ui/NavigatePropPage.cpp rename to source/tools/sced/ui/NavigatePropPage.cpp diff --git a/source/sced/ui/NavigatePropPage.h b/source/tools/sced/ui/NavigatePropPage.h similarity index 100% rename from source/sced/ui/NavigatePropPage.h rename to source/tools/sced/ui/NavigatePropPage.h diff --git a/source/sced/ui/OptionsDlg.cpp b/source/tools/sced/ui/OptionsDlg.cpp similarity index 100% rename from source/sced/ui/OptionsDlg.cpp rename to source/tools/sced/ui/OptionsDlg.cpp diff --git a/source/sced/ui/OptionsDlg.h b/source/tools/sced/ui/OptionsDlg.h similarity index 100% rename from source/sced/ui/OptionsDlg.h rename to source/tools/sced/ui/OptionsDlg.h diff --git a/source/sced/ui/OptionsPropSheet.cpp b/source/tools/sced/ui/OptionsPropSheet.cpp similarity index 100% rename from source/sced/ui/OptionsPropSheet.cpp rename to source/tools/sced/ui/OptionsPropSheet.cpp diff --git a/source/sced/ui/OptionsPropSheet.h b/source/tools/sced/ui/OptionsPropSheet.h similarity index 100% rename from source/sced/ui/OptionsPropSheet.h rename to source/tools/sced/ui/OptionsPropSheet.h diff --git a/source/sced/ui/ScEd.cpp b/source/tools/sced/ui/ScEd.cpp similarity index 100% rename from source/sced/ui/ScEd.cpp rename to source/tools/sced/ui/ScEd.cpp diff --git a/source/sced/ui/ScEd.h b/source/tools/sced/ui/ScEd.h similarity index 100% rename from source/sced/ui/ScEd.h rename to source/tools/sced/ui/ScEd.h diff --git a/source/sced/ui/ScEd.rc b/source/tools/sced/ui/ScEd.rc similarity index 100% rename from source/sced/ui/ScEd.rc rename to source/tools/sced/ui/ScEd.rc diff --git a/source/sced/ui/ScEdDoc.cpp b/source/tools/sced/ui/ScEdDoc.cpp similarity index 100% rename from source/sced/ui/ScEdDoc.cpp rename to source/tools/sced/ui/ScEdDoc.cpp diff --git a/source/sced/ui/ScEdDoc.h b/source/tools/sced/ui/ScEdDoc.h similarity index 100% rename from source/sced/ui/ScEdDoc.h rename to source/tools/sced/ui/ScEdDoc.h diff --git a/source/sced/ui/ScEdView.cpp b/source/tools/sced/ui/ScEdView.cpp similarity index 100% rename from source/sced/ui/ScEdView.cpp rename to source/tools/sced/ui/ScEdView.cpp diff --git a/source/sced/ui/ScEdView.h b/source/tools/sced/ui/ScEdView.h similarity index 100% rename from source/sced/ui/ScEdView.h rename to source/tools/sced/ui/ScEdView.h diff --git a/source/sced/ui/ShadowsPropPage.cpp b/source/tools/sced/ui/ShadowsPropPage.cpp similarity index 100% rename from source/sced/ui/ShadowsPropPage.cpp rename to source/tools/sced/ui/ShadowsPropPage.cpp diff --git a/source/sced/ui/ShadowsPropPage.h b/source/tools/sced/ui/ShadowsPropPage.h similarity index 100% rename from source/sced/ui/ShadowsPropPage.h rename to source/tools/sced/ui/ShadowsPropPage.h diff --git a/source/sced/ui/SimpleEdit.cpp b/source/tools/sced/ui/SimpleEdit.cpp similarity index 100% rename from source/sced/ui/SimpleEdit.cpp rename to source/tools/sced/ui/SimpleEdit.cpp diff --git a/source/sced/ui/SimpleEdit.h b/source/tools/sced/ui/SimpleEdit.h similarity index 100% rename from source/sced/ui/SimpleEdit.h rename to source/tools/sced/ui/SimpleEdit.h diff --git a/source/sced/ui/StdAfx.h b/source/tools/sced/ui/StdAfx.h similarity index 100% rename from source/sced/ui/StdAfx.h rename to source/tools/sced/ui/StdAfx.h diff --git a/source/sced/ui/TexToolsDlgBar.cpp b/source/tools/sced/ui/TexToolsDlgBar.cpp similarity index 100% rename from source/sced/ui/TexToolsDlgBar.cpp rename to source/tools/sced/ui/TexToolsDlgBar.cpp diff --git a/source/sced/ui/TexToolsDlgBar.h b/source/tools/sced/ui/TexToolsDlgBar.h similarity index 100% rename from source/sced/ui/TexToolsDlgBar.h rename to source/tools/sced/ui/TexToolsDlgBar.h diff --git a/source/sced/ui/UIGlobals.cpp b/source/tools/sced/ui/UIGlobals.cpp similarity index 100% rename from source/sced/ui/UIGlobals.cpp rename to source/tools/sced/ui/UIGlobals.cpp diff --git a/source/sced/ui/UIGlobals.h b/source/tools/sced/ui/UIGlobals.h similarity index 100% rename from source/sced/ui/UIGlobals.h rename to source/tools/sced/ui/UIGlobals.h diff --git a/source/sced/ui/UnitPropertiesAnimationsTab.cpp b/source/tools/sced/ui/UnitPropertiesAnimationsTab.cpp similarity index 100% rename from source/sced/ui/UnitPropertiesAnimationsTab.cpp rename to source/tools/sced/ui/UnitPropertiesAnimationsTab.cpp diff --git a/source/sced/ui/UnitPropertiesAnimationsTab.h b/source/tools/sced/ui/UnitPropertiesAnimationsTab.h similarity index 100% rename from source/sced/ui/UnitPropertiesAnimationsTab.h rename to source/tools/sced/ui/UnitPropertiesAnimationsTab.h diff --git a/source/sced/ui/UnitPropertiesDlgBar.cpp b/source/tools/sced/ui/UnitPropertiesDlgBar.cpp similarity index 100% rename from source/sced/ui/UnitPropertiesDlgBar.cpp rename to source/tools/sced/ui/UnitPropertiesDlgBar.cpp diff --git a/source/sced/ui/UnitPropertiesDlgBar.h b/source/tools/sced/ui/UnitPropertiesDlgBar.h similarity index 100% rename from source/sced/ui/UnitPropertiesDlgBar.h rename to source/tools/sced/ui/UnitPropertiesDlgBar.h diff --git a/source/sced/ui/UnitPropertiesTabCtrl.cpp b/source/tools/sced/ui/UnitPropertiesTabCtrl.cpp similarity index 100% rename from source/sced/ui/UnitPropertiesTabCtrl.cpp rename to source/tools/sced/ui/UnitPropertiesTabCtrl.cpp diff --git a/source/sced/ui/UnitPropertiesTabCtrl.h b/source/tools/sced/ui/UnitPropertiesTabCtrl.h similarity index 100% rename from source/sced/ui/UnitPropertiesTabCtrl.h rename to source/tools/sced/ui/UnitPropertiesTabCtrl.h diff --git a/source/sced/ui/UnitPropertiesTexturesTab.cpp b/source/tools/sced/ui/UnitPropertiesTexturesTab.cpp similarity index 100% rename from source/sced/ui/UnitPropertiesTexturesTab.cpp rename to source/tools/sced/ui/UnitPropertiesTexturesTab.cpp diff --git a/source/sced/ui/UnitPropertiesTexturesTab.h b/source/tools/sced/ui/UnitPropertiesTexturesTab.h similarity index 100% rename from source/sced/ui/UnitPropertiesTexturesTab.h rename to source/tools/sced/ui/UnitPropertiesTexturesTab.h diff --git a/source/sced/ui/UnitToolsDlgBar.cpp b/source/tools/sced/ui/UnitToolsDlgBar.cpp similarity index 100% rename from source/sced/ui/UnitToolsDlgBar.cpp rename to source/tools/sced/ui/UnitToolsDlgBar.cpp diff --git a/source/sced/ui/UnitToolsDlgBar.h b/source/tools/sced/ui/UnitToolsDlgBar.h similarity index 100% rename from source/sced/ui/UnitToolsDlgBar.h rename to source/tools/sced/ui/UnitToolsDlgBar.h diff --git a/source/sced/ui/WebLinkButton.cpp b/source/tools/sced/ui/WebLinkButton.cpp similarity index 100% rename from source/sced/ui/WebLinkButton.cpp rename to source/tools/sced/ui/WebLinkButton.cpp diff --git a/source/sced/ui/WebLinkButton.h b/source/tools/sced/ui/WebLinkButton.h similarity index 100% rename from source/sced/ui/WebLinkButton.h rename to source/tools/sced/ui/WebLinkButton.h diff --git a/source/sced/ui/resource.h b/source/tools/sced/ui/resource.h similarity index 100% rename from source/sced/ui/resource.h rename to source/tools/sced/ui/resource.h diff --git a/source/workspaces/premake/functions.lua b/source/workspaces/premake/functions.lua deleted file mode 100755 index 912c4f5039..0000000000 --- a/source/workspaces/premake/functions.lua +++ /dev/null @@ -1,7 +0,0 @@ -function sourcesfromdirs(...) - local res = {} - for i=1, getn(arg) do - res[i]=matchfiles(arg[i].."/*.cpp", arg[i].."/*.h") - end - return res -end \ No newline at end of file